UDN
Search public documentation:

UnrealScriptExpressionsCH
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 表达式& 操作符


概述


表达式 是任何文字值、变量、函数调用、操作符等的集合。比如, x + 2x - yy = x * 2SetCollision(true, true, true)x = Gethealth() 所有这些都是表达式。表达式构成了函数中的所有代码,同时执行了构成游戏的UnrealScript中的所有动作。当执行一个函数时,就是执行函数中的代码,而表达式构成了那些代码,因此UnrealScript虚拟机会处理这些代码。在大多数情况下,当计算一个表达式时,它将会产生一个可以由同一行代码中包含的其他个表达式可以使用的值。其中一个例外是调用一个不返回值的函数。

表达式中一个很重要的方面就是 操作符 的使用。从本质上讲,操作符是专门的特殊函数,它们在一个(一元)、两个(二元)或三个(三元)输入上执行特定的操作,并返回操作结果。最常见的一些操作符是加法( + )、减法( - )、乘法( * )和除法 (/) 操作符。实际上,从数学角度来说这些对于每个人都是非常熟悉的。它们都需要两个输入操作数,左右各一个,并使用这些操作符执行一些操作。某些操作符仅使用一个输入元,或者是使用左操作数、或者使用右操作数,而还有些操作符可能需要三个输入操作数。

一行完整的UnrealScript代码,可以由很多个函数构成,因此将其称为 语句

内置操作符


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中,无论何时当一个函数或其他表达式需要某种类型的数据(比如,“浮点型”数据)时,而您指定了一个不同类型的数据(比如,"整型"数据),那么编译器将尝试自动转换该值并将其赋予给定的类型。所有数值数据类型的(字节型、整型、浮点型)数据之间可以自动进行类型转换,不需要您进行干涉。在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" 转换为 TrueFalse ;并将任何非零值转换为 True ;其他值转换为 False
  • 将Bool 类型转换为String: 结果是 "True""False"
  • 将Byte、Int、Float、Vector、Rotator类型转换为Bool: 将非零值转换为 True ;零值转换为 False
  • 将Bool 数据类型转换为Byte、Int、Float: 将 True 类型转换为 1False 转换为 0
  • 将Name类型转换为String: 将名称转换为其文本等价物。
  • 将Rotator 类型转换为Vector: 根据旋转量返回朝向"前方的"向量。
  • 将为Vector类型转换为Rotator: 以向量方向返回旋转量的倾斜值和偏转值;旋转值为0。
  • 将Object (或Actor)类型转换为Int: 返回一个针对那个对象唯一的整数。
  • 将Object (或Actor)类型转换为Bool: 如果对象为 None 则返回 False , 否则返回 True
  • 将Object (或Actor)类型转换为String: 返回对象的文本表示。

请参照类型转换页面获得关于这个概念的完整介绍。

数学操作符

负数(-)
一元操作符。获得输入值的负值。这等价于将这个输入值和-1相乘。这个操作符的语法如下所示:
   -Input1
   
加、减、乘、除(+, -, *, /)
二元操作符。在两个输入操作数上执行对应的数学运算。这个操作符的语法如下所示:
   Input1 + Input2
   Input1 - Input2
   Input1 * Input2
   Input1 / Input2
   
求幂运算(*)*
二元操作符。左侧操作符为底数,右侧操作数为幂数。比如,数学表达式 x2 在UnrealScript中将写为 x ** 2 。这个操作符的语法如下所示:
   Input1 ** Input2
   
模运算(%)
二元操作符。返回左侧操作数除以右侧操作数后的余数。比如, 6 % 4 的结果是2,因为6可以被4整除一次,余数为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 。如果两个输入都是 String(字符串) 值,那么该比较是大小写敏感的。这个操作符的语法如下所示:
   Input1 == Input2
   
约等于(~=)
二元操作符。如果两个输入操作数是 Float 值,该操作符将会针对右侧输入操作数和左侧输入操作数进行比较,如果两个值彼此差距在 0.0001 之内则返回 TRUE ,否则返回 FALSE 。如果这两个输入操作数是 String 值,那么这将会执行大小写敏感的比较,如果两个字符串一样则返回 TRUE ,否则返回 FALSE 。这个操作符的语法如下所示:
   Input1 ~= Input2
   
不等于(!=)
二元操作符。针对右侧输入和左侧输入进行比较,如果它们一样则返回 FALSE ,否则返回 TRUE 。如果两个输入都是 String(字符串) 值,那么该比较是大小写敏感的。这个操作符的语法如下所示:
   Input1 != Input2
   
小于(<)
二元操作符。输入操作数可以是 ByteIntFloatString 类型的值。针对右侧输入操作数和左侧输入操作数进行比较,如果左侧输入操作数的值小于右侧输入操作数的值则返回 TRUE 。对于 String 类型的值来说,比较按照字母顺序进行。这个操作符的语法如下所示:
   Input1 < Input2
   
小于或等于(<=)
二元操作符。输入操作数可以是 ByteIntFloatString 类型的值。针对右侧输入操作数和左侧输入操作数进行比较,如果左侧输入操作数的值小于或等于右侧输入操作数的值则返回 TRUE 。对于 String 类型的值来说,比较按照字母顺序进行。这个操作符的语法如下所示:
   Input1 <= Input2
   
大于 (>)
二元操作符。输入操作数可以是 ByteIntFloatString 类型的值。针对右侧输入操作数和左侧输入操作数进行比较,如果左侧输入操作数的值大于右侧输入操作数的值则返回 TRUE 。对于 String 类型的值来说,比较按照字母顺序进行。这个操作符的语法如下所示:
   Input1 > Input2
   
大于或等于(>=)
二元操作符。输入操作数可以是 ByteIntFloatString 类型的值。针对右侧输入操作数和左侧输入操作数进行比较,如果左侧输入操作数的值大于或等于右侧输入操作数的值则返回 TRUE 。对于 String 类型的值来说,比较按照字母顺序进行。这个操作符的语法如下所示:
   Input1 >= Input2
   

逻辑操作符

与(&&)
二元操作符。比较左侧和右侧的输入操作数的值(该输入进行计算必须能等价于 Bool 值),如果两个输入操作数等于 TRUE ,那么则返回 TRUE 值。如果左侧输入计算等于 FALSE ,则忽略右侧输入操作数,并立即返回值 FALSE ,因为这个比较永远不会成功。如果左侧输入计算等于 FALSE ,那么也需要对右侧输入进行计算。这个操作符的语法如下所示:
   Input1 && Input2
   
或(||)
二元操作符。比较左侧和右侧的输入操作数的值(该输入进行计算必须能等价于 Bool 值),如果任何输入操作数计算等于 TRUE ,那么则返回 TRUE 值。如果左侧输入计算等于 TRUE ,则忽略右侧输入操作数,并立即返回值 TRUE ,因为这个比较成立。如果左侧输入计算等于 FALSE ,那么也需要对右侧输入进行计算。这个操作符的语法如下所示:
   Input1 || Input2
   
异或 (^^)
二元操作符。比较左侧和右侧的输入操作数的值(该输入进行计算必须能等价于 Bool 值),如果仅一个输入操作数计算等于 TRUE ,那么则返回 TRUE 值。将总是计算这两个操作数。这个操作符的语法如下所示:
   Input1 ^^ Input2
   

按位操作符

按位取反(-)
一元操作符。对输入操作数值中的每一位进行取反操作,也就是0变为1,1变为0。这个操作符的语法如下所示:
   ~Input1
   
按位与(&)
二元操作符。比较输入操作数值的二进制表示的每个单独的位,当每个输入操作数的值的对应位都等于1时则在结果中对应的位为1。如果这两个位上的数值是不同的或者都为0,那么结果中对应的位则设置为0。这个操作符仅对 Int 型输入有效,并且结果也将返回为 Int 的值。这个操作符的语法如下所示:
   Input1 & Input2
   
按位或(||)
二元操作符。比较输入操作数值的二进制表示的每个单独的位,当每个输入操作数的值中的位中任意一个为1时则在结果中对应的位为1。如果这两个位上的数值都为0,那么结果中对应的位则设置为0。这个操作符仅对 Int 型输入有效,并且结果也将返回为 Int 的值。这个操作符的语法如下所示:
   Input1 | Input2
   
按位异或 (^^)
二元操作符。比较输入操作数值的二进制表示的每个单独的位,当每个输入操作数的值中的位中仅一个为1时则在结果中对应的位为1。如果这两个位上的数值都为0或1,那么结果中对应的位则设置为0。这个操作符仅对 Int 型输入有效,并且结果也将返回为 Int 的值。这个操作符的语法如下所示:
   Input1 ^ Input2
   
右移 (>>)
二元操作符。要求两个输入操作数都为 Int 型值。在左侧输入操作数上执行向右移动。移动的位的数量是由右侧输入操作数决定的。按位右移会丢掉输入值的二进制表示的右侧的位;从本质上讲每移动一位相当于把输入值除以2。因为它处理的是 Ints 型数值,当奇数被2除时,结果是向下舍入的。这个操作符的语法如下所示:
   Input1 >> Input2
   
左移(<<)
二元操作符。要求两个输入操作数都为 Int 型值。在左侧输入操作数上执行向左移动。移动的位的数量是由右侧输入操作数决定的。按位左移会在输入值的二进制表示的右侧添加位;从本质上讲每移动一位相当于把输入值乘以2。这个操作符的语法如下所示:
   Input1 << Input2
   

向量操作符

叉积(Cross)
二元操作符。在两个输入 Vector(向量) 值上执行叉积操作,并输出一个和这两个输入向量垂直的 Vector(向量) 。这个操作符的语法如下所示:
   Input1 Cross Input2
   
点积 (Dot)
二元操作符。在两个输入 Vector(向量) 值上执行点积操作,并输出一个==Float(浮点)== 型值,代表左侧输入向右侧输入的标量映射。结果可以是从-1.0到1.0之间的任何地方(假设两个输入都是单位向量,比如每个向量的长度都是1),-1.0代表向量指向完全相反的方向,0.0代表它们是垂直向量,1.0代表指向同一方向的平行向量。这个操作符的语法如下所示:
   Input1 Dot Input2
   
反向旋转 (>>)
二元操作符。左侧输入必须是个 Vector(向量) ,右侧输入必须是个 Rotator(旋转量) 。使用右侧输入的旋转量对左侧输入的向量进行反向旋转,这从本质上上意味着该项量从局部空间中旋转给定的旋转量变换到世界空间中。这个操作符的语法如下所示:
   Input1 >> Input2
   
正向旋转(<<)
二元操作符。左侧输入必须是个 Vector(向量) ,右侧输入必须是个 Rotator(旋转量) 。使用右侧输入的旋转量对左侧输入的向量进行正向旋转,这从本质上上意味着该项量从世界空间中旋转给定的旋转量变换到局部空间中。这个操作符的语法如下所示:
   Input1 << Input2
   

如果您有个向量,它面向玩家我前方的64个单位处,那么 vect(64,0,0) 是局部玩家空间。如果想让它处于世界空间中,您必须使用玩家的旋转将其变换到世界空间中,所以您需要使用以下公式进行计算:

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

当您有一个世界空间向量并且您想让它位于玩家局部空间中时,您便可以使用正向旋转操作。作为示例,您可能项将一个汽车Actor的世界空间速度转换到局部空间中,那么您可以获得X(向前的速度),并将其描画到HUD上。

旋转量操作符

ClockwiseFrom(顺时针旋转)
二元操作符。左侧和右侧输入必须都是代表 Rotator(旋转量) 的单独分量(PitchYawRoll) 的 int 型值。返回一个 Bool 值(TRUEFALSE) ,来制定左侧输入是否从右侧输入顺时针旋转而来。这个操作符的语法如下所示:
   Input1 ClockwiseFrom Input2
   

三元操作符

条件操作符(? :)
三元操作符。根据第一个输入操作数的值返回两个输入操作数其中一个(第二个或第三个操作数)的值。从本质上讲,第一个输入的计算结果 TRUEFALSE 。如果第一个输入操作数计算为 TRUE ,那么则返回第二个输入操作数。如果该值为 FALSE ,则返回第三个输入操作数。这个操作符的语法如下所示:
   Input1 ? Input2 : Input3
   

操作符优先级


操作符的计算顺序可以完全地改变一个表达式的计算结果。每个操作符有一个特定的优先级值,该优先级值决定了当一个语句中包含多个操作符时操作符计算的先后顺序。当您使用一个负责的类似于 1 * 2 + 3 * 4 的表达式时,UnrealScript将按照操作符的优先级自动分组操作符。因为乘法的优先级比加法高,所以表达式作为 (1 * 2) + (3 * 4) 计算。

以下表格中显示了内置操作符的顺序(从最先到最后),同时显示了具有相同优先级的操作符的计算方向(结合性 列栏)。

操作符 结合性
( ) 从左到右
!, ++, --, -, ~ 从右到左
Dot, Cross, ClockwiseFrom 从左到右
*, /, % 从左到右
+, - 从左到右
<<, >> 从左到右
<, >, <=, >= 从左到右
=, !, ~= 从左到右
& 从左到右
^ 从左到右
| 从左到右
&& 从左到右
|| 从左到右
^^ 从左到右
@, $ 从左到右
, +, -=, *=, /=, @=, $= 从右到左

我们会不时地向引擎中添加新的操作符。关于完整的操作符列表,请查看最新的UnrealScript源码 - 尤其是 Object 类。