UDN
Search public documentation:
UnrealScriptExpressionsKR
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
언리얼스크립트 표현식 & 연산자
문서 변경내역: Tim Sweeney 원저. 홍성진 번역.
개요
x + 2
, x - y
, y = x * 2
, SetCollision(true, true, true)
, x = Gethealth()
같은 것이 모두 표현식입니다. 표현식은 함수 내 모든 코드를 구성하는 것이며, 게임을 이루는 UnrealScript 내 모든 동작을 구동하는 부분입니다. 함수가 실행되면, 함수 내 코드, 그 코드를 구성하는 표현식의 값을 UnrealScript 가상 머신이 구합니다. 대부분의 경우 표현식 값을 구할 때는, 같은 코드 줄 안에 포함된 다른 표현식이 사용할 수 있는 값을 만들어 냅니다. 이런 경우에 대한 예외라면, 값을 반환하지 않는 함수를 호출할 때가 되겠죠.
표현식에서 한 가지 중요한 점은, 연산자(operator) 를 사용한다는 점입니다. 연산자란 본질적으로 입력 하나(단항, unary), 둘(이항, binary), 가끔은 셋(삼항, ternary)에 대해 지정된 연산을 하고 그 결과를 반환하는 특수 함수입니다. 가장 흔히 쓰이는 연산자는 더하기 (+
), 빼기 (-
), 곱하기 (*
), 나누기 (/
) 연산자입니다. 산수를 배운 사람이라면 익숙할 것입니다. 이들 모두 좌 우에 입력을 둘 받아 일정한 연산을 합니다. 왼쪽 또는 오른쪽에 입력을 하나만 받는 연산자도 있고, (삼항 연산자같은 경우는) 입력이 셋 필요한 경우도 있습니다.
표현식 몇 개로 구성됐든, UnrealScript 에서 완전한 코드 한 줄은 문(statement) 이라고 합니다.
내장된 연산자
Object.u
에 정의되어 있으며, 이 글은 요약본입니다. 참고로 모든 C 스타일 연산자는 C 에서와 동일한 우선 순위를 갖습니다.
할당 (=)
변수에 값을 할당(assign)하려면==
연산자를 사용하며, 변수는 그 왼편에, 거기 할당시킬 값은 오른편에 놓습니다:
function Test() { local int i; local string s; local vector v, q; i = 10; // 정수형 변수 i 에 값을 할당합니다. s = "Hello!"; // 문자열 변수 s 에 값을 할당합니다. v = q; // 벡터 q 의 값을 v 에 복사합니다. }
function Test() { local int i; local string s; local vector v, q; local rotator r; s = string(i); // 정수형 i 를 문자열로 변환하여 s 에 할당합니다. s = string(v); // 벡터 v 를 문자열로 변환하여 s 에 할당합니다. v = q + vector(r); // 로테이터 r 을 벡터로 변환하여 q 에 더합니다. }
- String 을 Byte, Int, Float 로:
"123"
같은 문자열을 123 같은 값으로 변환 시도합니다. 스트링에 숫자 값이 없으면 결과는0
이 됩니다. - Byte, Int, Float, Vector, Rotator 을 String 으로: 숫자를 문자열 형태로 변환합니다.
- String 을 Vector, Rotator 로: 문자열을 벡터나 로테이터 식으로 맞춰 변환해 봅니다.
- String 을 Bool 로: 대소문자를 구분하지 않고
"True"
나"False"
를True
나False
로 변환합니다. 0 이외의 값은True
로, 나머지는False
로 변환합니다. - Bool 을 String 으로: 결과는
"True"
아니면"False"
입니다. - Byte, Int, Float, Vector, Rotator 를 Bool 로 : 0 이외의 값은
True
로, 0 은False
로 변환합니다. - Bool 을 Byte, Int, Float 로:
True
는1
,False
는0
으로 변환합니다. - Name 을 String 으로: 이름을 그에 맞는 문자열로 변환합니다.
- Rotator 를 Vector 로: 로테이터가 향하는 "앞면" 벡터를 반환합니다.
- Vector 를 Rotator 로: 로테이터의 Pitch 와 Yaw 를 벡터 방향으로 반환합니다. Roll 은 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 로 나누면 1 에 나머지는 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
논리 연산
- AND (&&)
- 이항. (
Bool
이어야 하는) 좌우항 값을 비교하여, 두 항 값 모두TRUE
이면TRUE
를 반환합니다. 좌항 값이FALSE
이면 더이상 비교할 필요가 없으니 우항은 무시하고 바로FALSE
를 반환합니다. 좌항이TRUE
이면 우항도 계산합니다. 이 연산자에 대한 문법은 아래와 같습니다:Input1 && Input2
- OR (||)
- 이항. (
Bool
이어야 하는) 좌우항 값을 비교하여, 어느 하나만TRUE
이면TRUE
를 반환합니다. 좌항 값이TRUE
이면 더이상 비교할 필요가 없으니 우항은 무시하고 바로TRUE
를 반환합니다. 좌항이FALSE
이면 우항도 계산합니다. 이 연산자에 대한 문법은 아래와 같습니다:Input1 || Input2
- XOR (^^)
- 이항. (
Bool
이어야 하는) 좌우항 값을 비교하여, 둘 중 하나만TRUE
이면TRUE
를 반환합니다. 항상 두 항 모두 계산합니다. 이 연산자에 대한 문법은 아래와 같습니다:Input1 ^^ Input2
비트 연산자
- 반대 (~)
- 단항. 입력 값 각 비트를 반전시킵니다. 즉 0 은 1 이 되고, 1 은 0 이 됩니다. 이 연산자에 대한 문법은 아래와 같습니다:
~Input1
- AND (&)
- 이항. 입력 값을 이진화하여 개별 비트를 비교, 둘 다 1 이면 결과 비트도 1 로 설정합니다. 두 비트 모두 0 이거나 서로 다르면, 결과 비트는 0 으로 설정합니다. 이 연산자는
Int
입력에만 가능하며, 반환되는 결과도Int
입니다. 이 연산자에 대한 문법은 아래와 같습니다:Input1 & Input2
- OR (|)
- 이항. 입력 값을 이진화하여 개별 비트를 비교, 둘 중 하나가 1 이면 결과 비트도 1 로 설정합니다. 두 비트 모두 0 이면 결과 비트도 0 으로 설정합니다. 이 연산자는
Int
입력에만 가능하며, 반환되는 결과도Int
입니다. 이 연산자에 대한 문법은 아래와 같습니다:Input1 | Input2
- XOR (^)
- 이항. 입력 값을 이진화하여 개별 비트를 비교, 두 비트가 다를 때만 결과 비트를 1 로 설정합니다. 두 비트가 같으면 결과 비트는 0 으로 설정합니다. 이 연산자는
Int
입력에만 가능하며, 반환되는 결과도Int
입니다. 이 연산자에 대한 문법은 아래와 같습니다:Input1 ^ Input2
- 우측 시프트 (>>)
- 이항. 둘 다
Int
값이어야 합니다. 좌항 값을 오른쪽으로 비트 단위 시프트(이동)합니다. 이동하는 비트 수는 우항으로 결정됩니다. 오른쪽 시프트는 입력 값 이진 표현의 오른쪽 비트를 버리며, 본질적으로 한 번 시프트할 때마다 2 로 나누는 것입니다.Int
이기에, 홀수는 2 로 나눈 뒤 소수점을 버립니다. 이 연산자에 대한 문법은 아래와 같습니다:Input1 >> Input2
- 좌측 시프트 (<<)
- 이항. 둘 다
Int
값이어야 합니다. 좌항 값을 왼쪽으로 비트 단위 시프트(이동)합니다. 이동하는 비트 수는 우항으로 결정됩니다. 왼쪽 시프트는 입력 값 이진 표현의 오른편에 비트를 추가하며, 본질적으로 한 번 시프트할 때마다 2 를 곱하는 것입니다. 이 연산자에 대한 문법은 아래와 같습니다:Input1 << Input2
벡터 연산자
- 교차 곱 (Cross)
- 이항. 두 항
Vector
값에 교차 곱 연산을 하여, 두 항에 수직인Vector
를 출력합니다. 이 연산자에 대한 문법은 아래와 같습니다:Input1 Cross Input2
- 도트 곱 (Dot)
- 이항. 두 항
Vector
값에 도트 곱 연산을 하여, 우항에 대한 좌항의 스칼라 프로젝션(, 즉 비율)을 나타내는Float
값을 출력합니다. (두 항 모두 단위 벡터, 즉 길이가 1 인 것으로 가정하면) 결과는 -1.0 에서 1.0 사이가 될 것이며, -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;
로테이터 연산자
- 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
클래스를 확인해 보시기 바랍니다.