// Latent functions. native(256) final latent function Sleep( float Seconds ); native(261) final latent function FinishAnim( AnimNodeSequence SeqNode, optional bool bFinishOnBlendOut );休眠函式只能在類別的狀態(state)中呼叫,它會暫停目前狀態內的程式執行,直到指定的條件達成。下例中的GotoState()會等Sleep(1)完成後才執行:
class MyPawn extends GamePawn;
state Idle
{
event BeginState(Name PreviousStateName)
{
Sleep(1);
GotoState('');
}
}
開發者也可自訂休眠函式,宣告休眠函式時要加上latent關鍵字。實作休眠函式需要寫另一個輪詢函式檢查是否要中止暫停繼續執行,以及選擇一個小於4096的整數做為這個休眠函式的索引值。休眠函式必須將索引值填入該物件的休眠代碼以暫停狀態執行,而輪詢函式必須在繼續執行時重設休眠代碼為零。而且輪詢函式必須以該索引值註冊。索引值需要跟其他休眠函式錯開,也必須跟UnrealScript的所有指令代碼錯開才行,因為它們都註冊在GNatives函式指標陣列中。為了確保索引值不重覆,可以直接啟動C++除錯查看GNatives陣列裡未被使用的空位。
範例
以下程式碼示範如何自訂一個會等待音效播完的休眠函式:
class MyLatentFunction extends Actor
native;
var AudioComponent LatentAudioComp;
native latent function FinishSound( AudioComponent AudioComp );
cpptext
{
DECLARE_FUNCTION(execPollFinishSound);
}
FinishSound() 宣告為休眠函式,而execPollFinishSound()註冊為它的輪詢函式:
enum
{
EPOLL_FinishSound = EPOLL_FinishAnim + 1,
};
void AMyLatentFunction::FinishSound( UAudioComponent* AudioComp )
{
GetStateFrame()->LatentAction = EPOLL_FinishSound;
LatentAudioComp = AudioComp;
}
void AMyLatentFunction::execPollFinishSound( FFrame& Stack, RESULT_DECL )
{
if( !LatentAudioComp || !LatentAudioComp->IsPlaying() )
{
GetStateFrame()->LatentAction = 0;
LatentAudioComp = NULL;
}
}
IMPLEMENT_FUNCTION( AMyLatentFunction, EPOLL_FinishSound, execPollFinishSound );
測試碼:
class TestLatentFunction extends MyLatentFunction;
var SoundCue Sound;
var AudioComponent AudioComp;
function Test(SoundCue InSound)
{
Sound = InSound;
GotoState("PlayingSound");
}
state PlayingSound
{
Begin:
AudioComp = CreateAudioComponent(Sound, true);
FinishSound(AudioComp);
GotoState('');
}
class MyCheatManager extends CheatManager;
exec function TestLatentFunction(SoundCue InSound)
{
local TestLatentFunction TLF;
TLF = Pawn.Spawn(class'TestLatentFunction');
TLF.Test(InSound);
}
沒有留言:
張貼留言