UDN
Search public documentation:

ActorComponentsKR
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 홈 > 언리얼스크립트 > 액터 컴포넌트
UE3 홈 > 게임플레이 프로그래밍 > 액터 컴포넌트

액터 컴포넌트


문서 변경내역: Andrew Scheidecker? 작성. Scott Sherman, Matt Oelfke 업데이트.

개요


언리얼 엔진에서 게임 관련 오브젝트는 모두 최상위 Actor 클래스로부터 파생됩니다. 이전 세대의 언리얼 엔진에서는 최상위 Actor 클래스가 매우 무거웠으며, Actor에서 파생된 서브클래스는 그 행태에 관계없이 모든 속성을 상속했었습니다.

Actor 렌더링 및 충돌의 모듈식 확장성용 인터페이스를 제공하는 여러 개의 경량 컴포넌트를 정의하여, 액터 컴포넌트는 이 문제를 해결합니다.

이전에 언리얼 엔진 2에서 정의된 하위 오브젝트 구문의 수정 버전을 사용하여, 클래스 기본 속성에 컴포넌트 프로토타입이 정의됩니다. 이 프로토타입에 이름이 붙여지고, 서브클래스에 상속됩니다. 서브클래스는 프로토타입의 기본 속성 가운데 일부 또는 전체를 오버라이드 할 수 있습니다. 컴포넌트를 사용하려면 이를 기본 속성을 통해 Actor 의 Components 배열에 추가합니다. 기본 속성에서 참조된 컴포넌트 프로토타입은 Actor 클래스와 함께 인스턴스됩니다. 기본 속성의 변경은 레벨에 저장되어 있는 기존의 Actor 클래스 인스턴스에 전달됩니다.

액터 컴포넌트 사용하기


ActorComponent 대 PrimitiveComponent

ActorComponent 는 월드의 액터에 첨가할 수 있는 오브젝트입니다.

PrimitiveComponent 는 렌더링 및 충돌이 가능한 ActorComponent 입니다.

컴포넌트 추가하기

인스턴스된 Actor는 (서브클래스가 Components 배열에서 Sprite를 제거하지 않은 한) 이와 함께 인스턴스된 SpriteComponent를 갖습니다.

Components 배열에서 참조된 컴포넌트는 Actor의 위치에 묶입니다.

예:

class Actor extends Object;

var const array<ActorComponent>   Components;

defaultproperties
{
   Begin Object Class=SpriteComponent Name=Sprite
      Sprite=S_Actor
      HiddenGame=True
   End Object
   Components.Add(Sprite)
}

컴포넌트 변경하기

예:

class Trigger extends Actor;

defaultproperties
{
   Begin Object Name=Sprite
      Sprite=S_Trigger
   End Object
}

컴포넌트 제거하기

예:

class StaticMeshActor extends Actor;

defaultproperties
{
   Components.Remove(Sprite)
   …
}

Sprite 컴포넌트 프로토타입은 더 이상 StaticMeshActor 클래스의 기본 속성에서 참조되지 않기에, StaticMeshActors 와 함께 인스턴스되지 않습니다.

컴포넌트 템플릿

컴포넌트 템플릿은 Actor 클래스의 기본 속성을 선언하는 데 사용됩니다. 컴포넌트 템플릿은 클래스의 기본 속성에서 참조된 컴포넌트에 대한 기본 속성을 포함하는 명명된 오브젝트입니다. 클래스가 인스턴스되면 그 클래스가 참조하는 모든 컴포넌트 템플릿도 함께 인스턴스됩니다.

컴포넌트 템플릿은 선언된 클래스의 서브클래스에 상속됩니다. 각 서브클래스는 상속된 템플릿의 개별 속성을 덮어씁니다.

컴포넌트 템플릿의 인스턴스는 템플릿의 기본 속성에 상대적으로 직렬화됩니다. 이로써 레벨에 배치된 이후 템플릿 속성에 가해진 변경내용이 계속해서 액터 컴포넌트의 인스턴스에 반영됩니다.

컴포넌트 템플릿 만들기

컴포넌트 템플릿은 클래스의 기본 속성에서 선언됩니다.

Begin Object Class=SpriteComponent Name=Sprite
 Sprite=Texture2D'EngineResources.S_Actor'
 HiddenGame=True
 AlwaysLoadOnClient=False
 AlwaysLoadOnServer=False
End Object

컴포넌트 템플릿 인스턴스 및 첨부

컴포넌트 템플릿은 클래스의 기본 속성에 의해 참조되지 않는 한 클래스와 함께 인스턴스되지 않으며, 액터 컴포넌트는 액터의 Components 배열에 있지 않은 한 액터에 첨부되지 않습니다. 기본 속성에서 컴포넌트 템플릿을 액터의 Components 배열에 추가하여 Actor 클래스로 액터 컴포넌트 템플릿을 인스턴스하고, 자동으로 인스턴스된 컴포넌트를 액터 인스턴스에 첨부시킬 수도 있습니다:

Begin Object Class=SpriteComponent Name=Sprite
 // 여기에 Sprite 컴포넌트 속성에 값을 배정
End Object
Components.Add(Sprite)

수퍼 클래스에서 상속받은 컴포넌트 템플릿의 속성 바꾸기

컴포넌트 템플릿은 그 템플릿이 초기에 선언된 클래스의 서브클래스에 상속됩니다. 서브클래스는 상속된 템플릿의 개별 속성을 덮어쓸 수 있습니다. 다음의 예에서는 Actor 로부터 Sprite 템플릿을 상속하여 스프라이트 텍스처의 속성만 변경합니다:

Begin Object Name=Sprite
 Sprite=Texture2D'EngineResources.S_SkyLight'
End Object

동적으로 생성된 컴포넌트

컴포넌트의 인스턴스를 동적으로 만들려면 언리얼스크립트의 new 연산자를 사용하고 액터의 AttachComponent 메써드를 호출하여 새 컴포넌트를 액터에 첨가합니다.

new 연산자에 대한 파라미터는 그 안에 컴포넌트를 만드는 Outer 오브젝트입니다; 이는 컴포넌트가 첨부될 대상 액터여야 합니다. 그래야 컴포넌트의 Outer 참조가 컴포넌트가 첨부될 액터 앞에서 불필요하게 다른 액터의 가비지 컬렉션을 차단하지 않습니다.

local StaticMeshComponent NewComponent;
NewComponent = new(self) class'StaticMeshComponent';
// 여기서 스태틱 메시 컴포넌트 속성 설정
AttachComponent(NewComponent);

앞서 첨부한 컴포넌트를 분리하여 비우려면, 액터의 DetachComponent 메써드를 사용하십시오. 컴포넌트에 대한 참조가 없게 되면 가비지 컬렉션됩니다.

공통 PrimitiveComponent 옵션

타입 이름 설명
boolean AlwaysLoadOnClient 만약 AlwaysLoadOnClient=False이고, 프리미티브의 HiddenGame=True 및 CollideActors=False이면, 해당 프리미티브는 게임 클라이언트에 로드되지 않습니다.
boolean AlwaysLoadOnServer 만약 AlwaysLoadOnServer=False이고, 프리미티브의 CollideActors=False 이면, 해당 프리미티브는 게임 서버에 로드되지 않습니다.
boolean BlockActors PrimitiveComponent에 충돌이 켜진 경우, BlockActors는 프리미티브의 충돌이 다른 액터들을 차단할지 여부를 결정합니다.
boolean CastShadow PrimitiveComponent가 그림자를 True면 드리우고, False면 드리우지 않습니다.
boolean CollideActors 액터의 bCollideActors 나 PrimitiveComponent 의 CollideActors 속성이 False 이면 그 프리미티브에 충돌이 없습니다.
boolean HiddenEditor PrimitiveComponent 가 에디터에서 렌더링되어야 하는 경우에는 False, 그렇지 않으면 True 입니다.
boolean HiddenGam PrimitiveComponent 가 게임에서 렌더링되어야 하는 경우에는 False, 그렇지 않으면 True입니다.

액터 충돌과 PrimitiveComponents

충돌 테스트는 액터에 첨부된 충돌하는 PrimitiveComponent 모두에 대해 수행되지만, 액터가 움직일 때는 단일 PrimitiveComponent 에 대한 테스트만 행해집니다. 이 PrimitiveComponent 는 액터의 속성인 CollisionComponent 를 설정함으로써 선택되어 액터 이동 충돌 확인에 사용되는 컴포넌트를 참조합니다. 액터가 움직이면 CollisionComponent 에 의해 참조된 컴포넌트의 경계 박스를 취해서 모든 충돌하는 PrimitiveComponen t들을 정리합니다.

내장 컴포넌트 타입


  • PrimitiveComponent
    • ArrowComponent
    • CameraConeComponent
    • CylinderComponent
    • DrawFrustumComponent
    • MeshComponent
      • StaticMeshComponent
      • SkeletalMeshComponent
    • ParticleSystemComponent
    • SpriteComponent
  • LightComponent
    • DirectionalLightComponent
    • PointLightComponent
      • SpotLightComponent
    • SkyLightComponent
  • AudioComponent
  • HeightFogComponent
  • SceneCaptureComponent
    • SceneCapture2DComponent
    • SceneCaptureCubeMapComponent
    • SceneCaptureParaboloidComponent
    • SceneCaptureReflectComponent

새 컴포넌트 타입 만들기


새 액터 컴포넌트 타입을 구현하려면 다음과 같은 ActorComponent 함수들을 덮어써서 첨가, 분리 및 움직임을 처리할 수 있습니다.

SetParentToWorld

UActorComponent::SetParentToWorld 는 컴포넌트가 첨부된 변환에 변경이 생길 때마다 호출됩니다. 이에는 항상 Attach 또는 UpdateTransform 에 대한 호출이 뒤따릅니다.

Attach

UActorComponent::Attach 는 컴포넌트가 처음 첨부될 때 호출됩니다. 항상 UActorComponent::Scene 이 설정되고 SetParentToWorld 가 호출된 다음에 호출됩니다. 또한 UActorComponent::IsValidComponent 가 False 를 반환하는 경우에는 절대 호출되지 않습니다.

UpdateTransform

UActorComponent::UpdateTransform 은 컴포넌트가 첨부된 변환이 이동할 때마다 호출됩니다. 이 앞에는 항상 SetParentToWorld 에 대한 호출이 오며 첨부되지 않은 컴포넌트에서는 절대 호출되지 않습니다.

Detach

UActorComponent::Detach 는 컴포넌트가 분리될 때 호출됩니다. 첨부되지 않은 컴포넌트에서는 절대 호출되지 않습니다.

IsValidComponent

UActorComponent::IsValidComponent 를 오버라이드하여 컴포넌트의 속성에서 추가적인 파라미터 유효성 확인을 수행할 수 있습니다. False 를 반환할 경우 컴포넌트가 첨부되지 않습니다.

부가 공지


첨부

이전에 언리얼 엔진2에서는 스켈레탈 메시의 본에 Actor 를 첨부할 수 있었습니다. 언리얼 엔진3 에서는 스켈레탈 메시 본에 Actor 컴포넌트만을 첨부할 수 있습니다.

첨부를 위해서는 컴포넌트를 Components 배열에 추가하지 말고 SkeletalMeshComponent 의 기본 속성에서 Attachments 배열에 항목을 추가합니다. 아니면 인스턴스된 참조를 컴포넌트에 추가하고 스크립트에서 SkeletalMeshComponent 의 AttachComponent 및 DetachComponent 함수를 사용하여 컴포넌트를 첨부합니다.

가비지 컬렉션

일반적으로 파기된 Actor는 목록에 추가됩니다. 이 목록의 액터가 128개가 되면 목록에서 액터에 대한 참조를 지우고, 액터를 놓아준 다음 목록을 비웁니다. 정기적으로(ini 옵션인 TimeBetweenPurgingPendingKillObjects 에 따라) 목록에 있는 액터로의 참조를 지우고, 액터를 해제시켜 빈 목록을 만듭니다.

액터 컴포넌트의 삭제는 Actor 가비지 컬렉션의 확장 기능입니다. 컴포넌트는 그것이 속해있는 Actor와 함께 삭제됩니다. Actor 에서 컴포넌트로의 참조는 컴포넌트가 삭제되기 전에 지워집니다.

자세한 내용은 Garbage Collection 페이지를 참고하십시오.