UDN
Search public documentation:

UnrealScriptDefaultPropertiesKR
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 홈 > 언리얼스크립트 > 언리얼스크립트 언어 참고서 > 언리얼스크립트 디폴트 프로퍼티

언리얼스크립트 디폴트 프로퍼티


문서 변경내역: Tim Sweeney 원저. 홍성진 번역.

개요


게임에서 오브젝트가 생성될 때, 그 프로퍼티는 "디폴트" 값으로 초기화됩니다. 이 값은 오브젝트를 만드는 데 사용된 클래스를 만들었던 게임플레이 프로그래머가 설정합니다. 많은 프로그래밍 언어에서는, 오브젝트를 생성할 때 변수를 초기화시키기 위해 생성자(constructor)라는 특수 함수를 호출합니다. UnrealScript 에는 이 개념에 딱 들어맞는 것이 없습니다. 대신 defaultproperties 라는 특수 "코드" 블럭을 사용해서 클래스에 속하는 인스턴스 변수 일부 또는 전부에 대한 값을 설정, 해당 클래스의 인스턴스 생성시 초기화 용도로 쓸 수 있습니다. 이 코드 블럭은 항상 모든 함수와 스테이트 선언 이후 스크립트의 끝에 옵니다. UnrealScript 의 일부긴 하지만, 이 블럭의 코드는 표준 UnrealScript 가 아니라 약간 다른 규칙을 따릅니다.

디폴트 프로퍼티 값 지정하기


앞서 말했던 것처럼, defaultproperties 블럭의 규칙은 표준 UnrealScript 문법과 약간 다릅니다. 일반적인 차이점은:

  • defaultproperties 블럭에 문(statement)은 허용되지 않지만, 동적 배열 작업은 예외입니다. 계산을 한다든가, 함수를 호출한다든가는 할 수 없다는 뜻입니다. defaultproperties 블럭은 오로지 인스턴스 변수에 실질적인 값을 할당하기 위한 용도입니다.
  • 줄 끝에 세미콜론을 넣을 수는 있지만, 필수는 아닙니다.
  • (변수 이름, 할당 연산자, 값 사이같은 곳에) 공백은 쓰지 말아야 합니다.
  • defaultproperties 블럭을 여는 대괄호는 새 줄에 와야 합니다.

위에 나열한 기본적인 차이 말고도, 일부 유형에 대한 문법이 UnrealScript 표준 할당 문법과 다른 것도 있습니다. 다양한 변수형에 디폴트 값 지정을 위한 문법은 아래와 같습니다:

단순형 (Int, Float, Bool, Byte):

VarName=Value

정적 배열:

ArrayProp(0)=Value1
ArrayProp(1)=Value2

또는

ArrayProp[0]=Value1
ArrayProp[1]=Value2

동적 배열:

ArrayProp=(Value1,Value2,Value3)

또는

ArrayProp(0)=Value1
ArrayProp(1)=Value2
ArrayProp(2)=Value3

또는

ArrayProp.Add(Value1)
ArrayProp.Add(Value2)
ArrayProp.Add(Value3)

네임:

NameProp='Value'

또는

NameProp=Value

오브젝트:

ObjectProp=ObjectClass'ObjectName'

서브오브젝트:

Begin Object Class=ObjectClass Name=ObjectName
   VarName=Value
   ...
End Object
ObjectProperty=ObjectName

구조체 (벡터, 로테이터 등 포함):

StructProperty=(InnerStructPropertyA=Value1,InnerStructPropertyB=Value2)

또는

StructProperty={(
                  InnerStructPropertyA=Value1,
                  InnerStructPropertyB=Value2
               )}

주: 일부 유형은 structdefaultproperties 안에서 사용될 때는 다른 문법을 씁니다.

  • 인라인 정적 배열은 다음과 같이 선언해야 합니다. (여기서는 배열 구분자로 괄호 "()" 대신 각괄호 "[]" 가 쓰였음에 유의하십시오.):
       StructProperty=(StaticArray[0]=Value,StaticArrayProp[1]=Value)
       
  • 인라인 동적 배열은 한 줄 문법으로 선언해야 합니다:
       StructProperty=(DynamicArray=(Value,Value))</code>
       
  • 인라인 네임 변수는 큰 따옴표로 묶어야 합니다:
       StructProperty=(NameProperty="Value")
       

동적 배열 연산 - 동적 배열 내용 수정을 위해 사용할 수 있는 것은 다음과 같으며, 부모에게 상속받을 수 있습니다.

  • Empty - 전체 배열을 비웁니다.
       Array.Empty
       
  • Add(element) - 배열 끝에 element 를 추가합니다.
       Array.Add(element)
       
  • Remove(element) - 배열에서 element 를 제거합니다. 모든 element 일치 부분을 제거합니다.
       Array.Remove(element)
       
  • RemoveIndex(index) - 주어진 index 의 요소를 제거합니다.
       Array.RemoveIndex(index)
       
  • Replace(element1, element2) - element1element2 로 대체합니다. 모든 일치 부분이 대체됩니다. element1 이 없으면 경고가 뜹니다.
       Array.Replace(element1, element2)
       

(Actor.uc 기준) 완전한 defaultproperties 블럭 예제는 다음과 같습니다:

defaultproperties
{
   	// 오브젝트
   	MessageClass=class'LocalMessage'

	// "Sprite" 라는 이름의 SpriteComponent 클래스 인라인 서브오브젝트 선언
   	Begin Object Class=SpriteComponent Name=Sprite
       		// 여기 지정된 값이 SpriteComponent 의 defaultproperties 를 덮어씁니다.
      		Sprite=Texture2D'EngineResources.S_Actor'
      		HiddenGame=true
   	End Object
   	//todo
   	Components.Add(Sprite)

	// "CollisionCylinder" 라는 이름의 CylinderComponent 클래스 인라인 서브오브젝트 선언
   	Begin Object Class=CylinderComponent Name=CollisionCylinder
       		// 여기 지정된 값이 CylinderComponent 의 defaultproperties 를 덮어씁니다.
      		CollisionRadius=10
      		CollisionHeight=10
      		AlwaysLoadOnClient=True
      		AlwaysLoadOnServer=True
   	End Object
   	//todo
   	Components.Add(CollisionCylinder)

   	CollisionComponent=CollisionCylinder

	// float (앞의 '+' 와 뒤의 'f' 글자는 무시됩니다.)
   	DrawScale=00001.000000
   	Mass=+00100.000000
   	NetPriority=00001.f

	// int 
   	NetUpdateFrequency=100

	// enumeration 
   	Role=ROLE_Authority
   	RemoteRole=ROLE_None

	// struct 
   	DrawScale3D=(X=1,Y=1,Z=1)

	// bool 
   	bJustTeleported=true
   	bMovable=true
   	bHiddenEdGroup=false
   	bReplicateMovement=true

	// name 
   	InitialState=None

	// 동적 배열 (이 경우 동적 클래스 배열)
   	SupportedEvents(0)=class'SeqEvent_Touch'
   	SupportedEvents(1)=class'SeqEvent_UnTouch'
   	SupportedEvents(2)=class'SeqEvent_Destroyed'
   	SupportedEvents(3)=class'SeqEvent_TakeDamage'
}

구조체 디폴트


UnrealScript 에서 구조체를 선언할 때, 옵션으로 구조체의 프로퍼티에도 디폴트 값을 지정할 수 있습니다. UnrealScript 에서 구조체가 사용될 때마다, 그 멤버는 이 값으로 초기화됩니다. 문법은 블럭 이름을 structdefaultproperties 로 해야 한다는 것을 제외하곤, 클래스에 대한 defaultproperties 블럭과 동일합니다. 예:

struct LinearColor
{
   var() config float R, G, B, A;

   structdefaultproperties
   {
      A=1.f
   }
};

UnrealScript 에서 LinearColor 변수를 선언할 때마다, 그 A 프로퍼티의 값은 1.f 로 설정됩니다. structdefaultproperties 사용시 이해해야 할 중요한 점 또 한가지는, 클래스 디폴트가 구조체 디폴트를 덮어쓴다는 점입니다. LinearColor 형의 클래스 멤버 변수가 있는 경우, 클래스 defaultproperties 에서 멤버 변수에 할당된 값은 구조체의 디폴트의 값을 덮어씁니다.

var LinearColor NormalColor, DarkColor;

defaultproperties
{
	NormalColor=(R=1.f,B=1.f,G=1.f)       // 이 프로퍼티에 대한 값은 1.0f 이 됩니다.
	DarkColor=(R=1.f,B=1.f,G=1.f,A=0.2f)  // A 의 값은 이 프로퍼티에 대해 0.2f 가 됩니다.
}

변수 디폴트 값 접근하기


레벨 디자이너가 언리얼 에디터를 통해 오브젝트의 클래스 "디폴트" 변수를 수정할 수 있습니다. 클래스의 새 액터가 스폰되면, 그 모든 변수는 디폴트로 초기화됩니다. 가끔은 한 변수를 디폴트 값으로 수동 돌리는 것이 좋을 때도 있습니다. 예를 들어 플레이어가 인벤토리 아이템을 떨어뜨리면, 인벤토리 코드는 액터 값 일부를 디폴트로 리셋시켜 줘야 합니다. UnrealScript 에서는 Default 키워드를 사용하여 클래스의 디폴트 변수에 접근할 수 있습니다. 예:

var() float Health, Stamina;

...

// 일부 변수를 디폴트로 돌립니다.
function ResetToDefaults()
{
	// health, stamina 를 리셋시킵니다.
   	Health = Default.Health;
   	Stamina = Default.Stamina;
}

클래스 리퍼런스를 통해 변수 디폴트 값 접근하기

클래스 리퍼런스 (class 또는 class<classlimitor> 형 변수)가 있는 경우, 그것이 가리키는 클래스의 디폴트 프로퍼티를, 해당 클래스의 오브젝트를 통하지 않고도 접근할 수 있습니다. 이 문법은 클래스 유형을 구하는 표현식과 함께 쓸 수 있습니다.

var class C;
var class PC;

Health = class'Spotlight'.default.LightBrightness;	// Spotlight 클래스의 Lightbrightness 
                                                   	// 디폴트 값에 접근합니다.

Health = PC.default.Health;	// PC 로 나타난 변수 클래스에 있는 
                            	// Health 의 디폴트 값에 접근합니다.

Health = class(C).default.Health;	// 형 변환된 클래스 표현식에 있는 
                                    	// Health 의 디폴트 값에 접근합니다.