2013年10月17日 星期四

自訂UnrealScript型別轉換

UnrealScript跟其他程式語言一樣,有型別轉換的功能。每個型別轉換對應到一個轉換指令,可在一個二維全域陣列GConversions中查表找出對應的指令代碼,再到全域函式指標陣列GCasts中找到對應的轉換函式。

如果要自訂型別轉換,大致需要以下步驟:
  • 在列舉型別ECastToken中新增一個成員代表這個轉換指令。
  • GConversions的第一個索引是目標型別,第二個索引是來源型別。我們需要修改對應的GConversions元素成自訂的轉換指令。
  • 撰寫對應的轉換函式並且註冊到GCasts。
 

範例


本例示範如何新增一個從物件轉成名稱的型別轉換,轉換後變成該物件的名稱。首先新增CST_ObjectToName代表這個轉換:
enum ECastToken
{
...
    CST_ObjectToName  = 0x61,
    CST_Max     = 0xFF,
};
然後在GConversions中修改對應欄位為CST_ObjectToName:
static DWORD GConversions[CPT_MAX][CPT_MAX] =
{
            /*   None      Byte                Int                 Bool              Float                Object             ...
...
/* Name     */ { CST_Max,  CST_Max,            CST_Max,            CST_Max,          CST_Max,             CST_ObjectToName,  ...
...
};
最後撰寫對應的轉換函式並且註冊到GCasts即可。
void UObject::execObjectToName( FFrame& Stack, RESULT_DECL )
{
    P_GET_OBJECT(UObject,Obj);
    *(FName*)Result = Obj ? Obj->GetFName() : NAME_None;
}
IMPLEMENT_CAST_FUNCTION( UObject, CST_ObjectToName, execObjectToName );
然後就可以在UnrealScript中進行原本不支援的物件到名稱轉換:
class MyCheatManager extends GameCheatManager within GamePlayerController;

exec function TestObjectToName()
{
    local name n;
    n = name(self);
    `log(n);
}

沒有留言:

張貼留言