您的位置:首页 > 其它

【打发时间之US脚本】读书笔记4

2014-02-08 20:36 309 查看
读书笔记3搁浅了,可能是UDN教程上的炮台模型的骨骼坐标出现问题,yaw pitch roll变量全部乱了,如果按照他那个坐标来的话,我估计会疯掉,先写4吧

一、Delegates(代理)

1.开头:

Delegates是到实例中到函数的引用(cry,原文是什么个意思)

Delegates由两个编程概念组成:函数和变量。

代理和变量类似,因为它可以存储值并且可以在运行时改变。

2.概述:

当运行时要求代码执行具有动态性和灵活性时,通常会使用代理(=。=多态?)

2.1代码1

var int GlobalVar;
function Foo(float value)
{
GlobalVar = value;
Bar();
}
function Bar()
{
switch(GlobalVar)
{
case 0:
DoThis();
break;
case 1:
DoThat();
break;
default:
DoDefault();
break;
}
}


这段代码是在运行时动态地改变代码执行的一种方法。不灵活,需要添加很多条件时,需要很多精力去维护Bar()。

2.2代码2

delegate Bar();

function Foo(float value)
{
switch(value)
{
case 0:
Bar = DoThis();
break;
case 1:
Bar = DoThat();
break;
default:
Bar = DoDefault();
break;
}
Bar();
}


这段代码比上一段好点,首先,它删除了全局变量和运行Bar()时对该变量的判断。

但是仍然很麻烦。

2.3代码3

delegate Bar();

function Foo(delegate<Bar> BarDelegate)
{
Bar = BarDelegate;
Bar();
}


这段代码更加好,删除了switch。无论添加多少个不同条件,都不需要维护Foo()或Bar()函数(虽然不是很清楚delegate内部,接着往下看吧)

3.声明代理(Delegate)

代理(Delgate)的声明方法和函数声明一样。但是她没有使用关键字function,而是使用关键字delegate

delegate Foo();

这个类现在有一个名称为Foo()的代理

3.1代理参数

和函数一样,代理可以具有参数。当函数和代理结合使用时,函数也必须包含和代理一样的参数,请考虑以下情况:

delegate Foo(const float Bar, const float Doh);
function FooBoom(const float Bar, const float Doh);
function FooFail(const float Bar);


把FooBoom()分配给Foo()是有效的,但是把FooFail()分配给Foo()是无效的。

注意:不过有这么一个例外

delegate Foo(const float Bar, const float Doh, optional float Moe);
function FooBoom(const float Bar, const float Doh);


可以吧FooBoom()分配给Foo()仍然是幼小的,但不能在FooBoom()中使用Moe。代理也可以具有返回参数。

3.2默认行为

delegate Foo()
{
`Log("默认行为!");
}

function Bar()
{
`Log("不是默认行为!");
}

function Bing()
{
Foo = Bar;
Foo();
Foo() = none;
Foo() ;
}


打印:

不是默认行为!

默认行为!

小节:大概理解代理的意思,有点像C++中的。。。那个。。。我也忘记了,好久没看C++都忘记了,反正就是像那啥来着的~

4.代理变量

可以像使用变量那样来使用代理。不能进行算术计算,但是可以赋值。

delegate Foo();
function Bar();
function PostBeginPlay()
{
Foo = Bar;
}
有时候比较代理来查看它们当前正在引用的函数式什么。请考虑以下情况:

delegate Foo();
function Bar();
function Rod();
function PostBeginPlay()
{
Foo = Bar;

if(Foo == Bar)
`Log("Foo是Bar");
}

5.传递Delegate给函数

delegate Foo();
function Bar();
function PassDelegate()
{
ReceiveDelegate(Bar);
}
function ReceiveDelegate(delegate<Foo> FooDelegate)
{
Foo = FooDelegate;
}

代理是私有的或保护的,所以其他类不能正常地访问代理,比如:

class Pizza extends Object;
private delegate Eat();
function EatMe()
{
Eat();
}
function HowToEat(delegate<Eat> EatDelegate)
{
Eat = EatDelegate;
}

class Mushroom extends Object;
function SpitOut()
{
`Log("卧槽,我吐了,太难吃了");
}
function EatPizza(Pizza pizza)
{
if(pizza != none)
{
pizza.HowToEat(SpitOut);
pizza.EatMe();
}
}

6.代理和内存

当代理引用了世界中的actor实例中纯在的函数时,删除那个actor实例是安全的。

但是代理引用了存在于另一个对象实例中的函数,则必须把代理设为none,因为

US不能根据请求来销毁对象实例,所以所有的循环引用都必须被删除,否则将不

能对该对象实例进行垃圾回收,那么当前关卡改变或当游戏退出时可能会发生内

存泄露。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息