목차

Unreal Units 변경

UnrealUnits 는 언리얼엔진에서 길이를 나타내는 단위이다.

이것은 우리가 일상적으로 생각하는 단위가 아니라 언리얼엔진에서 통용되는 길이 단위이다. 에픽에서 이 단위를 고안한 만큼 엔진 내부 네이티브 코드는 이 UnrealUnits 를 기준으로 최적화 되어있다.

많은 수의 Constants가 이것에 맞게 정의가 되어있고 특정 부분은 하드코딩도 되어있다. 때문에 우리가 임의로 이것을 바꾸면 엔진 내에서 느껴지는 물리법칙이 실세계의 그것과 많이 달라지게 된다.

여기선 이 UnrealUnits 의 개념을 알아보고 프로젝트에서 불가피하게 이것을 변경해야 할 시에는 어떻게 후처리를 해야하는지를 알아본다.

현재 게임 스케일

모든 언리얼토너먼트의 경우 1 UnrealUnits (이하UU) 는 현세계의 2cm 로 규정한다.

기여워2의 경우 2UU 가 1inch 이다. (1inch = 2.54cm, 그러므로 1UU = 1.27cm 정도?), 기여워2의 마커스의 키가 156UU (198.12cm) 이고 건물은 대략 256UU (325.12cm) 이다. 이것은 grid 를 적절하게 표현하기 위해 결정되었으며 덕분에 cover 높이문제가 잘 해결되었다.

대부분의 언리얼 라이센스게임들은 1UU를 1cm로 사용한다.

언리얼엔진3 에서 맵의 최대 크기는 528,000 x 528,000 unreal units 이다. 때문에 1UU 를 얼마나 줄 것인지에 따라 최대 맵 크기가 결정된다.

1UU 가 2cm 라면 대략 10.56km x 10.56km 의 맵 크기가 된다. 잘 생각해서 결정하자.

http://forums.epicgames.com/showthread.php?t=346761 여길 보면 marsmod 라고 70 x 70 마일 까지 표현한 세팅이 있으니 참고해도 좋을 듯. 물론 해상도에선 불이익이 있겠지만

맥스에서 불러오기

언리얼엔진3는 Max의 1unit을 1UU로 취급한다.

게임플레이

게임플레이를 위해서 Scout.uc 와 Pawn.uc 의 subclass 의 일부 속성들을 적절하게 바꿔줘야 한다.

또한 defaultgame.ini 파일에서 우리가 정한 UU 에 맞는 중력값을 지정할 수 있다. 또한 Scout.uc 의 subclass 를 지정해줄 수 있다.

또한 Pawn.uc 의 subclass 에서는 기본값들을 변경할 필요가 있다. (MaxStepHeight, MaxJumpHeight, MaxOutOfWaterStepHeight, CrouchHeight, CrouchRadius, GroundSpeed, AirSpeed, JumpZ, DefaultGravityZ, etc)

길찾기

정상적인 길찾기를 위해 Scout.uc 에 있는 속성들을 변경할 필요가 있다. (PathSizes, TestJumpZ 등등)

물리

UnPhysPublic.h (line 70) 에 두가지 constants가 있다.

UnPhysPublic.h
// These need to be public for UnrealEd etc.
const FLOAT P2UScale = 050.0f;
const FLOAT U2PScale = 0.02f;

각각 “physics to unreal” 그리고 “unreal to physics” 로 변환해주는 factor이다. UnrealUnits 가 변경되면 이것들도 역시 적절하게 변경해줘야 한다.

이때 Physics 오브젝트의 평균 크기가 1 unit 이 되도록 해주는것이 중요하다.

한가지 알려진 이슈는 RB_ConstraintSetups 에 있는 joint position 이 Physics 단위로 되어 있다는 것이다. (Unreal 단위가 아님) 때문에 Ragdoll 을 생성할 때 U2PScale 을 적용해줘야 한다. 그렇지 않으면 joint 위치가 틀려지는데 이때 해결책으로는 Ragdoll 을 다시 생성하거나 RB_ConstraintSetups 의 PostLoad() 에서 Unreal 단위로 다시 변환해주면 된다.

그 밖에 수 많은 스케일 관련 하드코드들이 UnPhysic.cpp 에 들어있다. 여기 사용되는 스케일 관련 하드코드 값들이 UnPhysics.h 에 있지만 미처 고려하지 못한 값도 있을 수 있기 때문에 UnPhysic.cpp 을 잘 살펴보자.

Collision / BSP

위치의 동일함(equality)을 체크하기 위해 사용되는 epsilon 값도 적절히 변경해 줘야 한다. 만약 꽤 많이 스케일 값이 변경되었다면 아래 것들을 변경해주자.

UnBsp.cpp
#define THRESH_OPTGEOM_COPLANAR        (0.25)   
#define THRESH_OPTGEOM_COSIDAL         (0.25) 
UnMath.h
#define FLOAT_NORMAL_THRESH            (0.0001f)
#define THRESH_POINT_ON_PLANE          (0.10f)
#define THRESH_POINT_ON_SIDE           (0.20f)
#define THRESH_POINTS_ARE_SAME         (0.002f)
#define THRESH_POINTS_ARE_NEAR         (0.015f)
#define THRESH_NORMALS_ARE_SAME        (0.00002f)
#define THRESH_VECTORS_ARE_NEAR        (0.0004f)
#define THRESH_SPLIT_POLY_WITH_PLANE   (0.25f)   
#define THRESH_SPLIT_POLY_PRECISELY    (0.01f)      
#define THRESH_ZERO_NORM_SQUARED       (0.0001f)   
#define THRESH_VECTORS_ARE_PARALLEL    (0.02f)

그리고 이 값들 주변에 있는 주석을 살펴보고 관련이 있는 값들을 모두 변경해줘야 한다.

네트워킹

네트워킹 코드 중에 bandwidth 를 절약하기 위해 position 을 integer UnrealUnit 으로 양자화(quantization)한다. 이 또한 적절하게 변경해줘야 한다.

참조