读书笔记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不能根据请求来销毁对象实例,所以所有的循环引用都必须被删除,否则将不
能对该对象实例进行垃圾回收,那么当前关卡改变或当游戏退出时可能会发生内
存泄露。