UDN
Search public documentation:
UnrealScriptExpressionsJP
English Translation
中国翻译
한국어
Interested in the Unreal Engine?
Visit the Unreal Technology site.
Looking for jobs and company info?
Check out the Epic games site.
Questions about support via UDN?
Contact the UDN Staff
中国翻译
한국어
Interested in the Unreal Engine?
Visit the Unreal Technology site.
Looking for jobs and company info?
Check out the Epic games site.
Questions about support via UDN?
Contact the UDN Staff
UnrealScript の式と演算子
概要
x + 2
、 x - y
、 y = x * 2
、 SetCollision(true, true, true)
、 x = Gethealth()
などはすべて式です。関数内部にあるコードはすべて式から成り立っています。また、式は、ゲームを構成する、UnrealScript 内部のアクションすべてを実行するものです。関数が実行されると、関数内部のコード (すなわち、コードを構成する式) が、UnrealScript バーチャルマシーンによって評価されます。たいていの場合は、式が評価されると値が生成され、同じ行のコードに含まれている他の式が、この値を使用することができます。例外は、関数呼び出しの場合です。この場合は値が返されません。
式の重要な要素として、 演算子 の使用があります。演算子は、本質的に、特化された関数と言えます。なぜなら、1 個の (一項からなる) 入力、または、2 個の (二項からなる) 入力、時として 3 個の (三項からなる) 入力を使って演算を実行し、その演算結果を返すからです。最も一般的な演算子としては、加算演算子 ( +
)、減算演算子 ( -
)、乗算演算子 ( *
)、除算演算子 ( /
) があげられます。これらは、数学のおかげで誰にも馴染みのあるものです。これらの演算子は、すべて、2 個の入力 (左右に) を取り、これらの入力を使って何らかの演算を実行します。演算子の中には 1 個の入力 (左右どちらか) しか取らないものもあります。また、3 個の入力を必要とするものもあります (三項演算子のように)。
UnrealScript において完結している一行のコード (任意の数の式から構成される) は、 文 (statement) と言います。
ビルトインされている演算子
Object.u
で定義されているため、以下では、概略を紹介します。なお、C スタイルの演算子は、すべて、C の場合と同じ優先順位をもちます。
代入 (=)
値を変数に代入するには、=
演算子を使用します。代入する値は演算子の右に置き、代入される変数は演算子の左に置きます。
function Test() { local int i; local string s; local vector v, q; i = 10; // Assign a value to integer variable i. s = "Hello!"; // Assign a value to string variable s. v = q; // Copy value of vector q to v. }
function Test() { local int i; local string s; local vector v, q; local rotator r; s = string(i); // Convert integer i to a string, and assign it to s. s = string(v); // Convert vector v to a string, and assign it to s. v = q + vector(r); // Convert rotator r to a vector, and add q. }
- String 型から Byte型、Int 型、Float 型に変換 : 文字列 (例 :
"123"
) から値 (例 :123
) への変換を試みます。文字列が値を表さない場合は、演算結果が0
となります。 - Byte型、Int 型、Float 型、Vector 型、Rotator 型から String 型に変換 : 数値をテキスト表現に変換します。
- String 型から Vector 型、Rotator 型に変換 : ベクターまたはローテータのテキスト表現をパースしようとします。
- String 型から Bool 型に変換 : 大文字と小文字を区別しない語である
"True"
または"False"
を、True
またはFalse
に変換します。非ゼロの値をすべてTrue
に変換します。それ以外はすべてFalse
になります。 - Bool 型から String 型に変換 : 演算結果は、
"True"
または"False"
のどちらかになります。 - Byte型、Int 型、Float 型、Vector 型、Rotator 型から Bool 型に変換 : 非ゼロの値を
True
に変換します。ゼロの値はFalse
になります。 - Bool 型から Byte型、Int 型、Float 型に変換 :
True
を1
に変換します。False
は0
になります。 - Name 型から String 型に変換 : 名前を代替テキストに変換します。
- Rotator 型から Vector 型に変換 : ローテータにしたがって「前」を向くベクターを返します。
- Vector 型から Rotator 型に変換 : ベクターの方向にピッチおよびヨーするローテータを返します。ロールはゼロになります。
- Object (Actor) 型から Int 型に変換 : そのオブジェクトのために一意であることが保証された整数を返します。
- Object (Actor) 型から Bool 型に変換 : オブジェクトが
None
の場合、False
を返します。そうでない場合は、True
を返します。 - Object (Actor) 型から String 型に変換 : オブジェクトのテキスト表現を返します。
数学演算子
- 否定 (-)
- 単項演算子 入力値をネゲート(否定)します。入力値に -1 を乗じることに等しい機能をもつ演算子です。この演算子のシンタックスは、次のようになります。
-Input1
- 加算、減算、乗算、除算 (+、-、*、/)
- 二項演算子 2 個の入力について数学演算子と同じ演算を実行します。この演算子のシンタックスは、次のようになります。
Input1 + Input2 Input1 - Input2 Input1 * Input2 Input1 / Input2
- べき乗
= (*) =
- 二項演算子 左の入力を、右の入力を指数にしたべき乗に引き上げます。たとえば、 x2 という数式は、UnrealScript で書くと
x * 2
となります。この演算子のシンタックスは、次のようになります。
Input1 ** Input2
- モジュロ (%)
- 二項演算子 左の入力を右の入力で除算したときの剰余を返します。たとえば、
6 % 4
の演算結果は、6÷4=1・・・2 であるから、2 になります。この演算子のシンタックスは、次のようになります。
Input1 % Input2
- 加算、減算、乗算、除算および代入 (+= 、-= 、*= 、/=)
- 二項演算子 各演算子に相当する数学演算を実行した後に、最初の入力に演算結果を代入します。(したがって、左の入力は変数でなければなりません)。たとえば、
x
の値が 2 の場合に、x *= 4
を実行すると、x
の値は 8 になります。 まず乗算が実行され、その後にその演算結果が左の入力 (この場合x
) に代入されます。この演算子のシンタックスは、次のようになります。
Input1 += Input2 Input1 -= Input2 Input1 *= Input2 Input1 /= Input2
文字列演算子
- 結合 / 結合および代入 ($/$=)
- 二項演算子 右の入力文字列を左の入力文字列に追加し、その結果を返します。「入力」バージョンの演算子 ($=) は、演算結果を左の入力に代入します。(したがって、左の入力は変数でなければなりません)。この演算子のシンタックスは、次のようになります。
Input1 $ Input2 Input1 $= Input2
- スペース付き結合/スペース付き結合と代入 (@/@=)
- 二項演算子 右の入力文字列を左の入力文字列に追加する際に、それらの間にスペースを入れ、その結果を返します。「入力」バージョンの演算子 ($=) は、演算結果を左の入力に代入します。(したがって、左の入力は変数でなければなりません)。この演算子のシンタックスは、次のようになります。
Input1 @ Input2 Input1 @= Input2
比較演算子
- * 等値 (==) *
- 二項演算子 右の入力と左の入力を比較して、同一の場合は
TRUE
を返し、異なる場合はFALSE
を返します。2 つの入力がString 型
の値である場合、この比較は大文字と小文字を区別します。この演算子のシンタックスは、次のようになります。
Input1 == Input2
- 近似等値 (~=)
- 二項演算子 2 つの入力が
Float 型
の値である場合、右の入力と左の入力を比較します。2 つの値の差が0.0001
以内である場合は、TRUE
を返し、そうでない場合は、FALSE
を返します。2 つの入力がString 型
の値である場合は、大文字と小文字を区別せずに比較を実行します。2 つの文字列が同一である場合はTRUE
を返し、そうでない場合は、FALSE
を返します。この演算子のシンタックスは、次のようになります。
Input1 ~= Input2
- 非等値 (!=)
- 二項演算子 右の入力と左の入力を比較し、同一である場合は
FALSE
を返し、そうでない場合は、TRUE
を返します。2 つの入力がString 型
の値である場合、この比較は大文字と小文字を区別します。この演算子のシンタックスは、次のようになります。
Input1 != Input2
- 小なり (<)
- 二項演算子 入力は、
Byte 型
、Int 型
、Float 型
、String 型
の値を取ることができます。右の入力と左の入力を比較し、左の入力値が右の入力値よりも小さい場合はTRUE
を返します。String 型
の値については、アルファベット順による比較を行います。この演算子のシンタックスは、次のようになります。
Input1 < Input2
- 小なりイコール (<=)
- 二項演算子 入力は、
Byte 型
、Int 型
、Float 型
、String 型
の値を取ることができます。右の入力と左の入力を比較し、左の入力値が右の入力値よりも小さいか等しい場合はTRUE
を返します。String 型
の値については、アルファベット順による比較を行います。この演算子のシンタックスは、次のようになります。
Input1 <= Input2
- 大なり (>)
- 二項演算子 入力は、
Byte 型
、Int 型
、Float 型
、String 型
の値を取ることができます。右の入力と左の入力を比較し、左の入力値が右の入力値よりも大きい場合はTRUE
を返します。String 型
の値については、アルファベット順による比較を行います。この演算子のシンタックスは、次のようになります。
Input1 > Input2
- 大なりイコール (>=)
- 二項演算子 入力は、
Byte 型
、Int 型
、Float 型
、String 型
の値を取ることができます。右の入力と左の入力を比較し、左の入力値が右の入力値よりも大きいか等しい場合はTRUE
を返します。String 型
の値については、アルファベット順による比較を行います。この演算子のシンタックスは、次のようになります。
Input1 >= Input2
論理演算子
- 論理 AND (&&)
- 二項演算子 左の入力値と右の入力値 (
Bool 型
の値として評価されなければならない) を比較し 、両方の入力値がTRUE
と評価される場合は、TRUE
を返します。左の入力値がFALSE
と評価された場合は、比較が成功することがありえないため、右の入力を無視して直ちにFALSE
という値を返します。左の入力がTRUE
と評価された場合は、右の入力も評価されます。この演算子のシンタックスは、次のようになります。
Input1 && Input2
- 論理 OR (||)
- 二項演算子 左の入力値と右の入力値 (
Bool 型
の値として評価されなければならない) を比較し 、どちらか一方の入力値でもTRUE
と評価される場合は、TRUE
を返します。左の入力値がTRUE
と評価された場合は、比較が必ず成功するため、右の入力を無視して直ちにTRUE
という値を返します。左の入力がTRUE
と評価された場合は、右の入力も評価されます。この演算子のシンタックスは、次のようになります。
Input1 || Input2
- 論理 XOR (^^)
- 二項演算子 左の入力値と右の入力値 (
Bool 型
の値として評価されなければならない) を比較し 、どちらか一方の入力値のみTRUE
と評価される場合は、TRUE
を返します。必ず両方の入力が評価されます。この演算子のシンタックスは、次のようになります。
Input1 ^^ Input2
ビット演算子
- 否定 (~)
- 単項演算子 入力値の各ビットを反転させます。すなわち、0 は 1 になり、1 は 0 になります。この演算子のシンタックスは、次のようになります。
~Input1
- AND (&)
- 二項演算子 各入力値の 2 進表現において、各ビットを比較し、各入力値のビットが両方とも 1 になっている場合は、演算結果において対応するビットを 1 にセットします。両ビットが異なる場合、または、両方とも 0 になっている場合は、演算結果において対応するビットを 0 にセットします。この演算子は、
Int 型 == の入力についてのみ有効です。また、演算結果も ==Int 型
で返されます。この演算子のシンタックスは、次のようになります。
Input1 & Input2
- OR (|)
- 二項演算子 各入力値の 2 進表現において、各ビットを比較し、各入力値のビットのうちどちらか一方でも 1 になっている場合は、演算結果において対応するビットを 1 にセットします。両ビットとも 0 になっている場合は、演算結果において対応するビットを 0 にセットします。この演算子は、
Int 型 == の入力についてのみ有効です。また、演算結果も ==Int 型
で返されます。この演算子のシンタックスは、次のようになります。
Input1 | Input2
- XOR (^)
- 二項演算子 各入力値の 2 進表現において、各ビットを比較し、各入力値のビットのうちどちらか一方のみが 1 になっている場合は、演算結果において対応するビットを 1 にセットします。両ビットとも 0 になっている場合、または、両ビットとも 1 になっている場合は、演算結果において対応するビットを 0 にセットします。この演算子は、
Int 型 == の入力についてのみ有効です。また、演算結果も ==Int 型
で返されます。この演算子のシンタックスは、次のようになります。
Input1 ^ Input2
- *右シフト (>>) *
- 二項演算子 両入力とも
Int 型
の値でなければなりません。左の入力に対して、ビット単位に右シフトさせます。シフトするビットの量は、右の入力によって決められます。右シフトによって、入力値の 2 進表現の右端からビットが切り捨てられます。本質的には、ビットが右にシフトされるたびに、2 で除算されています。この演算子はInt 型
を対象とするため、奇数が 2 で除算されると、演算結果が切り捨てられます。この演算子のシンタックスは、次のようになります。
Input1 >> Input2
- *左シフト (<<) *
- 二項演算子 両入力とも
Int 型
の値でなければなりません。左の入力に対して、ビット単位に左シフトさせます。シフトするビットの量は、右の入力によって決められます。左シフトによって、入力値の2進表現の右端にビットが追加されます。本質的には、ビットが左にシフトされるたびに、2 で乗算されています。この演算子のシンタックスは、次のようになります。
Input1 << Input2
ベクター演算子
- 外積 (Cross)
- 二項演算子 2 つの
Vector 型
の入力値の外積を計算し、これら 2 つの入力に対して垂直なVector 型
を出力します。この演算子のシンタックスは、次のようになります。
Input1 Cross Input2
- 内積 (Dot)
- 二項演算子 2 つの
Vector 型
の入力値の内積 (ドットプロダクト) を計算し、右入力への左入力のスカラー投影を表すFloat 型
の値を出力します。演算結果が取る値の範囲は、-1.0 から 1.0 までです (2 つの入力値とも単位ベクトルであることが想定されています。すなわち、いずれも 1 の長さをもちます)。演算結果が -1.0 の場合は、完全に反対方向を向いているベクターを表します。0.0 の場合は、垂直なベクターを表します。1.0 の場合は、同じ方向を向いている平行なベクターであることを表します。この演算子のシンタックスは、次のようになります。
Input1 Dot Input2
- *逆転 (>>) *
- 二項演算子 左入力は
Vector 型
であり、かつ、右入力はRotator 型
でなければなりません。右入力の回転を使用して、左入力のベクターの逆転を実行します。本質的には、指定された回転を使用してベクターをローカル空間からワールド空間に変えることになります。この演算子のシンタックスは、次のようになります。
Input1 >> Input2
- *正転 (<<) *
- 二項演算子 左入力は
Vector 型
であり、かつ、右入力はRotator 型
でなければなりません。右入力の回転を使用して、左入力のベクターの正転を実行します。本質的には、指定された回転を使用してベクターをワールド空間からローカル空間に変換することになります。この演算子のシンタックスは、次のようになります。
Input1 << Input2
Vector 型
がある場合は、 vect(64,0,0)
がローカルのプレイヤー空間にあります。このベクターをワールド空間に置きたい場合は、プレイヤーの回転を使用してワールド空間に変換します。すなわち、次のように計算することになります。
myWorldSpaceVect = vect(64,0,0) >> playerPawn.rotation;
Rotator 演算子
- ClockwiseFrom (〜から右回り)
- 二項演算子 左入力と右入力は、
Rotator 型
の各成分 (ピッチ
、ヨー
、ロール
) を示すInt 型
の値でなければなりません。Bool 型
の値 (TRUE
またはFALSE
) を返すことによって、左入力が右入力の右回りであるか否かを示します。この演算子のシンタックスは、次のようになります。
Input1 ClockwiseFrom Input2
三項演算子
- 条件演算子 (?:)
- 三項演算子 第 1 の入力の値に基づいて、2 つの入力のうちから 1 つの入力の値を返します。具体的には、まず 1 番目の入力が
TRUE
またはFALSE
のどちらかとして評価されます。1 番目の入力がTRUE
と評価された場合は、2 番目の入力が返されます。1 番目の入力がFALSE
と評価された場合は、3 番目の入力が返されます。この演算子のシンタックスは、次のようになります。
Input1 ? Input2 : Input3
演算子の優先順位
1 * 2 + 3 * 4
といった複合的な式が使用されている場合でも、UnrealScript は優先順位に基づいて演算子を自動的にグループ化します。乗算は加算よりも優先順位が高いため、上記の式は、 (1 * 2) + (3 * 4)
として評価されます。
ビルトインされている演算子の優先順位は、以下の表にまとめられています (上にあるほど高い順位になります)。同時に、同じ優先順位の演算子が評価される方向もまとめています (結合規則の欄)。
演算子 | 結合規則 |
---|---|
( ) | 左から右 |
!, ++, --, -, ~ | 右から左 |
Dot, Cross, ClockwiseFrom | 左から右 |
*, /, % | 左から右 |
+, - | 左から右 |
<< , >> | 左から右 |
<, >, <=, >= | 左から右 |
=, ! , ~= | 左から右 |
& | 左から右 |
^ | 左から右 |
| | 左から右 |
&& | 左から右 |
|| | 左から右 |
^^ | 左から右 |
@, $ | 左から右 |
, + , -=, *=, /=, @=, $= | 右から左 |
Object
クラス) を参照してください。