讀書筆記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不能根據請求來銷燬對象實例,所以所有的循環引用都必須被刪除,否則將不
能對該對象實例進行垃圾回收,那麼當前關卡改變或當遊戲退出時可能會發生內
存泄露。