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
日本語訳
한국어
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虚拟机会处理这些代码。在大多数情况下,当计算一个表达式时,它将会产生一个可以由同一行代码中包含的其他个表达式可以使用的值。其中一个例外是调用一个不返回值的函数。
表达式中一个很重要的方面就是 操作符 的使用。从本质上讲,操作符是专门的特殊函数,它们在一个(一元)、两个(二元)或三个(三元)输入上执行特定的操作,并返回操作结果。最常见的一些操作符是加法( +
)、减法( -
)、乘法( *
)和除法 (/
) 操作符。实际上,从数学角度来说这些对于每个人都是非常熟悉的。它们都需要两个输入操作数,左右各一个,并使用这些操作符执行一些操作。某些操作符仅使用一个输入元,或者是使用左操作数、或者使用右操作数,而还有些操作符可能需要三个输入操作数。
一行完整的UnrealScript代码,可以由很多个函数构成,因此将其称为 语句 。
内置操作符
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: 以向量方向返回旋转量的倾斜值和偏转值;旋转值为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
- 小于(<)
- 二元操作符。输入操作数可以是
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
逻辑操作符
- 与(&&)
- 二元操作符。比较左侧和右侧的输入操作数的值(该输入进行计算必须能等价于
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
vect(64,0,0)
是局部玩家空间。如果想让它处于世界空间中,您必须使用玩家的旋转将其变换到世界空间中,所以您需要使用以下公式进行计算:
myWorldSpaceVect = vect(64,0,0) >> playerPawn.rotation;
旋转量操作符
- ClockwiseFrom(顺时针旋转)
- 二元操作符。左侧和右侧输入必须都是代表
Rotator(旋转量)
的单独分量(Pitch
、Yaw
和Roll
) 的int
型值。返回一个Bool
值(TRUE
或FALSE
) ,来制定左侧输入是否从右侧输入顺时针旋转而来。这个操作符的语法如下所示:Input1 ClockwiseFrom Input2
三元操作符
- 条件操作符(? :)
- 三元操作符。根据第一个输入操作数的值返回两个输入操作数其中一个(第二个或第三个操作数)的值。从本质上讲,第一个输入的计算结果
TRUE
或FALSE
。如果第一个输入操作数计算为TRUE
,那么则返回第二个输入操作数。如果该值为FALSE
,则返回第三个输入操作数。这个操作符的语法如下所示:Input1 ? Input2 : Input3
操作符优先级
1 * 2 + 3 * 4
的表达式时,UnrealScript将按照操作符的优先级自动分组操作符。因为乘法的优先级比加法高,所以表达式作为 (1 * 2) + (3 * 4)
计算。
以下表格中显示了内置操作符的顺序(从最先到最后),同时显示了具有相同优先级的操作符的计算方向(结合性 列栏)。
操作符 | 结合性 |
---|---|
( ) | 从左到右 |
!, ++, --, -, ~ | 从右到左 |
Dot, Cross, ClockwiseFrom | 从左到右 |
*, /, % | 从左到右 |
+, - | 从左到右 |
<<, >> | 从左到右 |
<, >, <=, >= | 从左到右 |
=, ! , ~= | 从左到右 |
& | 从左到右 |
^ | 从左到右 |
| | 从左到右 |
&& | 从左到右 |
|| | 从左到右 |
^^ | 从左到右 |
@, $ | 从左到右 |
, + , -=, *=, /=, @=, $= | 从右到左 |
Object
类。