native(146) static final operator(20) int + ( int A, int B );關鍵字native後面括弧裡面的數字是靜態查表索引,索引值不可重覆。靜態查表不限用於運算子,只要是原生函式都可使用。它的查詢速度比一般的動態查表快,通常是用在常用的函式。關鍵字operator用來宣告運算子,後面括弧裡面的數字代表運算優先權,用來建立先乘除後加減的規則。優先權越高的越先運算。
UnrealScript運算子只能使用固定組合的字符,以下列出其中幾個可用的字符以及它們在程式碼中的名稱:
| + | Add |
| - | Subtract |
| * | Multiply |
| / | Divide |
| += | AddEqual |
| -= | SubtractEqual |
| *= | MultiplyEqual |
| /= | DivideEqual |
| ++ | AddAdd |
| -- | SubtractSubtract |
| == | EqualEqual |
若想要增加可用的字符,可以修改UnScrCom.cpp的FScriptCompiler::GetToken()函式。
運算子對應的C++函式名稱是固定的,為:
"exec" + 運算子名稱 + "_" + 第一個運算元型別 + 第二個運算元型別例如一開始提到的整數加法,對應的函式名稱即execAdd_IntInt。
範例
以下程式碼示範如何自訂一個可以作Vector和Vector2D加法的運算子。為了不修改引擎原始碼,在此把運算子宣告在自訂的類別,所以只有該類別或子類別才可使用此運算子。
class MyOperator extends Object
native;
native static final operator(20) Vector + ( Vector A, Vector2D B );
static function Test()
{
local Vector A, B;
local Vector2D C;
B = vect(1, 2, 3);
C.x = 1;
C.y = 2;
A = B + C;
}
編譯過上列UnrealScript後會自動產生以下的C++類別定義:
class UMyOperator : public UObject
{
public:
DECLARE_FUNCTION(execAdd_VectorVector2D);
DECLARE_CLASS(UMyOperator, UObject, 0, MyGame)
NO_DEFAULT_CONSTRUCTOR(UMyOperator)
};
其中的execAdd_VectorVector2D()函式正是對應到先前在UnrealScript宣告的運算子。DECLARE_FUNCTION巨集宣告的函式參數都一樣,第一個參數是執行UnrealScript用的堆疊,可由此取得運算元,第二個參數是存放傳回值位址的void指標。以下是該函式的實作碼:
void UMyOperator::execAdd_VectorVector2D( FFrame& Stack, RESULT_DECL )
{
P_GET_VECTOR(A);
P_GET_VECTOR2D(B);
P_FINISH;
FVector* R = (FVector*)Result;
*R = A;
R->X += B.X;
R->Y += B.Y;
}
沒有留言:
張貼留言