读书笔记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 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 FooDelegate)
{
Foo = FooDelegate;
}
代理是私有的或保护的,所以其他类不能正常地访问代理,比如:
class Pizza extends Object;
private delegate Eat();
function EatMe()
{
Eat();
}
function HowToEat(delegate 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不能根据请求来销毁对象实例,所以所有的循环引用都必须被删除,否则将不
能对该对象实例进行垃圾回收,那么当前关卡改变或当游戏退出时可能会发生内
存泄露。