现在的位置: 首页 > 综合 > 正文

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

2018年05月06日 ⁄ 综合 ⁄ 共 2344字 ⁄ 字号 评论关闭

读书笔记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不能根据请求来销毁对象实例,所以所有的循环引用都必须被删除,否则将不

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

存泄露。

抱歉!评论已关闭.