2012年9月26日 星期三

動態存取UnrealScript的enum

雖然對於UnrealScript來說,enum一旦編譯完是不能修改的。但對C++而言就不是這麼一回事了,畢竟UnrealScript是用C++實作出來的。

例如AudioDevice類別的ESoundClassName列舉,在uc檔裡只宣告了一個Master項目:
enum ESoundClassName
{
     Master
};
實際上編輯SoundMode時,型別為ESoundClassName的SoundClassName卻會列舉出所有的SoundClass。其實這是因為在C++中可以動態修改UnrealScript的enum。

2012年9月16日 星期日

自訂骨架控制

UE的動畫樹(AnimTree)提供動畫混合、變形混合、骨架控制三種功能。它可以讓開發者自訂節點來擴充新的功能,在此篇簡單說明一下如何自訂骨架控制節點。

骨架控制節點的基礎類別叫做SkelControlBase,其他的骨架控制節點都會直接或間接繼承自此類別。它定義數個C++虛擬函式以供子類別擴充,以下列出重要的成員:
  • GetAffectedBones(BoneIndex, SkeletalMeshComponent, OutBoneIndices):可覆寫此函式傳回要修改的骨頭之索引值。
  • CalculateNewBoneTransforms(BoneIndex, SkeletalMeshComponent, OutBoneAtoms):可覆寫此函式傳回修改後的骨頭位置和方向。傳回的陣列必須和GetAffectedBones()相對應。
  • CalculateNewBoneScales(BoneIndex, SkeletalMeshComponent, OutBoneScales):可覆寫此函式傳回修改後的骨頭縮放值。傳回的陣列必須和GetAffectedBones()相對應。
  • GetBoneScale(BoneIndex, SkeletalMeshComponent):可覆寫此函式傳回此骨架控制的骨頭縮放值。
  • TickSkelControl(DeltaSeconds, SkeletalMeshComponent):可覆寫此函式每畫面更新骨架控制節點。