【打發時間之US腳本】讀書筆記4

讀書筆記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不能根據請求來銷燬對象實例,所以所有的循環引用都必須被刪除,否則將不

能對該對象實例進行垃圾回收,那麼當前關卡改變或當遊戲退出時可能會發生內

存泄露。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章