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

UE3 ホーム > UnrealScript > UnrealScript 言語のリファレンス > UnrealScript の式と演算子

UnrealScript の式と演算子


概要


(expression) とは、リテラル値、変数、関数の呼び出し、演算子などを組み合わせたものです。たとえば、 x + 2x - yy = x * 2SetCollision(true, true, true)x = Gethealth() などはすべて式です。関数内部にあるコードはすべて式から成り立っています。また、式は、ゲームを構成する、UnrealScript 内部のアクションすべてを実行するものです。関数が実行されると、関数内部のコード (すなわち、コードを構成する式) が、UnrealScript バーチャルマシーンによって評価されます。たいていの場合は、式が評価されると値が生成され、同じ行のコードに含まれている他の式が、この値を使用することができます。例外は、関数呼び出しの場合です。この場合は値が返されません。

式の重要な要素として、 演算子 の使用があります。演算子は、本質的に、特化された関数と言えます。なぜなら、1 個の (一項からなる) 入力、または、2 個の (二項からなる) 入力、時として 3 個の (三項からなる) 入力を使って演算を実行し、その演算結果を返すからです。最も一般的な演算子としては、加算演算子 ( + )、減算演算子 ( - )、乗算演算子 ( * )、除算演算子 ( / ) があげられます。これらは、数学のおかげで誰にも馴染みのあるものです。これらの演算子は、すべて、2 個の入力 (左右に) を取り、これらの入力を使って何らかの演算を実行します。演算子の中には 1 個の入力 (左右どちらか) しか取らないものもあります。また、3 個の入力を必要とするものもあります (三項演算子のように)。

UnrealScript において完結している一行のコード (任意の数の式から構成される) は、 (statement) と言います。

ビルトインされている演算子


UnrealScript には、C/C++/Java スタイルの演算子が多数そろっており、数の加算や値の比較、変数のインクリメントといった演算を実行することができます。演算子の完全なセットは、 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.
}

UnrealScript では、関数や他の式によって特定の型のデータ (たとえば、float 型) が必要とされるにもかかわらず、それとは異なる型 (たとえば、int 型) が指定された場合、必ず、コンパイラによって、指定された値が適切な型に自動的に変換されます。この変換は、すべての数値データ型 (byte 、int 、float) の間で自動的に行われるため、ユーザー側ですべきことは一切ありません。また、UnrealScript では、ビルトインされているデータ型の多くを他の型に変換することが可能です (明示的にコードで変換する場合)。

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.
}

以下は、UnrealScript で使用することができる非自動的な変換の完全なリストです。

  • 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 型に変換 : True1 に変換します。 False0 になります。
  • 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

プレイヤーよりも 64 単位前方で対向している Vector 型 がある場合は、 vect(64,0,0) がローカルのプレイヤー空間にあります。このベクターをワールド空間に置きたい場合は、プレイヤーの回転を使用してワールド空間に変換します。すなわち、次のように計算することになります。

myWorldSpaceVect = vect(64,0,0) >> playerPawn.rotation;

ワールド空間のベクターがあり、これをローカルのプレイヤー空間に置きたい場合は、正転を利用しなければなりません。たとえば、自動車アクタのワールド空間における速度をローカル空間に変換することによって、X (順方向速度) を得て HUD に表示することができます。

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 左から右
*, /, % 左から右
+, - 左から右
<< , >> 左から右
<, >, <=, >= 左から右
=, !, ~= 左から右
& 左から右
^ 左から右
| 左から右
&& 左から右
|| 左から右
^^ 左から右
@, $ 左から右
, +, -=, *=, /=, @=, $= 右から左

時折、エンジンに新たな演算子が追加されることがあります。演算子の完全なリストは、最新の UnrealScript のソース (特に Object クラス) を参照してください。