2013年4月22日 星期一

自訂按鍵綁定格式

UE的按鍵綁定功能可以在ini檔中指定按鍵會觸發的命令,開發者可以在UnrealScript中撰寫exec function,再設定好按鍵綁定即可在遊戲中使用,相當方便。按鍵綁定主要分成按鈕和類比軸兩種,各自有不同的設定格式,詳情可以參考UDN。如果想要自訂新的格式,可以改寫PlayerInput的Exec。

 範例


以下程式碼示範如何自訂一個可以取得按住時間的按鍵綁定格式:
class MyPlayerInput extends PlayerInput within MyPlayerController
    native;

var input float fPressingTime;

var native const Map{FName,FLOAT}  NameToPressedTime;

cpptext
{
    // UInput interface.
    virtual UBOOL Exec(const TCHAR* Cmd, FOutputDevice& Ar);
}
由於玩家可能會同時按住多個按鍵,所以在此使用一個map記錄不同按鍵的按下時間。按住時每個frame都會接到IE_Repeat事件,更新到指定的欄位即可:
UBOOL UMyPlayerInput::Exec(const TCHAR* Cmd, FOutputDevice& Ar)
{
    TCHAR Temp[256];
    
    if( ParseCommand( &Cmd, TEXT("PRESSINGTIME") ) )
    {
        FLOAT* Button;
        if( ParseToken( Cmd, Temp, ARRAY_COUNT(Temp), 0 ) )
        {
            if( (Button = FindAxisName(Temp)) != NULL )
            {
                switch( CurrentEvent )
                {
                case IE_Pressed:
                    NameToPressedTime.Set(Temp, GWorld->GetWorldInfo()->RealTimeSeconds);
                    break;
                
                case IE_Released:
                    NameToPressedTime.Set(Temp, 0.f);
                    break;
                
                case IE_Repeat:
                    FLOAT* PressedTime = NameToPressedTime.Find(Temp);
                    if( PressedTime && *PressedTime > 0.f)
                     *Button = GWorld->GetWorldInfo()->RealTimeSeconds - *PressedTime;
                    break;
                }
            }
            else Ar.Log( TEXT("Bad Button command") );
        }
        else Ar.Log( TEXT("Bad Button command") );
            
        return TRUE;
    }
    
    return Super::Exec( Cmd, Ar );
}
FindAxisName()實際上並不會區分按鈕或類比軸,而是只找浮點數欄位,所以在此是用FindAxisName()而不是FindButtonName()。在Exec()中是取得不到原來觸發命令的綁定按鍵,所以退而求其次,map的鍵值是採用指定的欄位名稱。

要使用時,記得要在DefaultInput.ini裡設定,例如:
.Bindings=(Name="SpaceBar",Command="PressingTime fPressingTime")

沒有留言:

張貼留言