UDN
Search public documentation:

ActorComponentsJP
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

アクタ コンポーネント

ドキュメントの概要: ActorComponent の使用とカスタム アクタ コンポーネント タイプの作成に関する解説。

ドキュメントの変更ログ: Andrew Scheidecker? により作成。長期管理。

概要

Unreal Engine において、すべてのゲーム関連オブジェクトは基本 Actor クラスから派生されます。前世代のUnreal Engine では、基本Actor クラスは非常に重いもので、アクタ派生サブクラスはビヘイビアに関係なく、すべてのプロパティを継承します。

アクタコンポーネントは、アクタのレンダリングおよびコリジョンのモジュラー拡張性用インターフェースを提供する複数のライトウェイトコンポーネントを定義することにより問題を解決します。

コンポーネントプロトタイプはクラスのデフォルトプロパティで定義されます。また、Unreal Engine 2にて以前に定義されたサブオブジェクトの構文の変更済みバージョンを使用します。プロトタイプには名前がつけられ、サブクラスにより継承されます。サブクラスはプロトタイプのいくつかのまたはすべてのデフォルトプロパティをオーバーライドできます。コンポーネントを使用するには、デフォルトプロパティを通してアクタのコンポーネント配列に追加してください。デフォルトプロパティにて参照されたコンポーネントプロトタイプはアクタクラスと共にインスタンス化されます。デフォルトプロパティはレベルで保存されたアクタクラスの既存インスタンスにプロパゲートされます。

アクタ コンポーネントの使用

ActorComponent (アクタコンポーネント) と PrimitiveComponent (プリミティブコンポーネント) との違い

ActorComponent (アクタコンポーネント) は、ワールド内のアクタに添付して利用するオブジェクトです。

PrimitiveComponent (プリミティブコンポーネント) は、その ActorComponent でも、レンダリングや衝突が可能なもののことです。

コンポーネントを追加する

インスタンス化されるアクタは、それと共にインスタンス化される SpriteComponent を持ちます(サブクラスがコンポーネント配列から Sprite を削除しない限り)

コンポーネント配列により参照されたコンポーネントはアクタの位置にバインドされます。

例:

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でインスタンス化されません。

コンポーネント テンプレート

コンポーネント テンプレートはアクタ クラスのデフォルト コンポーネントの宣言に使用します。コンポーネント テンプレートは名前つきのオブジェクトで、クラスのデフォルト プロパティで参照するコンポーネントのデフォルト プロパティを含んでいます。クラスがインスタンス化されると、そのクラスが参照するすべてのコンポーネント テンプレートも一緒にインスタンス化されます。

コンポーネント テンプレートは、それ自体が宣言されたクラスのサブクラスに継承されます。各サブクラスは継承したテンプレートのそれぞれのプロパティをオーバーライドできます。

コンポーネント テンプレートのインスタンスはテンプレートのデフォルト プロパティにしたがって連続化されます。これによりアクタ コンポーネントのインスタンスには、テンプレート プロパティをレベルに設置した後に行われた変更内容が常に反映されるようになります。

コンポーネント テンプレートの作成

コンポーネント テンプレートはクラスのデフォルト プロパティで宣言します。:

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

コンポーネント テンプレートのインスタンス化と関連付け

クラスの デフォルト プロパティで参照したコンポーネント テンプレートだけが、クラスでのインスタンス化を行えます。また、アクタの Components 配列にあるアクタ コンポーネントのみ、アクタに関連付けることができます。デフォルト プロパティで、コンポーネント テンプレートをアクタの Components 配列に追加すると、アクタ コンポーネント テンプレートをアクタ クラスでインスタンス化することができ、また、インスタンス化したコンポーネントを自動的にアクタ インスタンスに関連付けることができます。:

Begin Object Class=SpriteComponent Name=Sprite
   // スプライト コンポーネントのプロパティ値をここで割り当て
End Object
Components.Add(Sprite)

スーパー クラスから継承したコンポーネント テンプレートのプロパティを変更する

コンポーネント テンプレートは、テンプレートが最初にせんげんされたクラスのサブクラスが継承します。サブクラスは継承したテンプレートのそれぞれのプロパティをオーバーライドできます。この例ではアクタから Sprite テンプレートを継承し、スプライト テクスチャ プロパティだけを書き換えます:

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

動的に作成されたコンポーネント

コンポーネントのインスタンスを動的に作成するには、UnrealScript の new 演算子を使用し、新しいコンポーネントをアクタに関連付けするため、アクタの AttachComponent メソッドを呼び出します。

new 演算子へのパラメータは、コンポーネントを作成する外側(Outer)のオブジェクトで、このコンポーネントを内包して関連付けられるべきアクタです。 こうすることで、他のアクターにコンポーネントが関連付けられてガーベジコレクションをされる前に、コンポーネントの外部参照を設定して不用意にガーベジコレクションされることを確実に防げるようにします。

local StaticMeshComponent NewComponent;
NewComponent = new(self) class'StaticMeshComponent';
// ここに、静的メッシュコンポーネントのプロパティを設定する
AttachComponent(NewComponent);

アクタを動的にコンポーネントから切り離したい場合は、アクタの DetachComponent メソッドを利用します。これはアクタの配列 Components からコンポーネントを削除して、アクタから切り離します。

共通 PrimitiveComponent オプション

名前 説明
boolean AlwaysLoadOnClient AlwaysLoadOnClient=False で、プリミティブの HiddenGame=True で CollideActors=False の場合、プリミティブはゲーム クライアントにロードされません。
boolean AlwaysLoadOnServer AlwaysLoadOnServer=False で、プリミティブの CollideActors=False の場合、プリミティブはゲーム サーバにロードされません。
boolean BlockActors PrimitiveComponent の衝突が有効の場合、BlockActor でプリミティブの衝突が他のアクタをブロックするかどうかを定義します。
boolean CastShadow PrimitiveComponent がシャドウを投影する場合は True、投影しない場合は False。
boolean CollideActors アクタの bCollideActors または PrimitiveComponent の CollideActors プロパティのいずれかが False なら、プリミティブは衝突を起こしません。
boolean HiddenEditor PrimitiveComponent がエディタ内でレンダリングするなら False、レンダリングしないなら True。
boolean HiddenGame PrimitiveComponent がゲーム内でレンダリングするなら False、レンダリングしないなら True。

アクタの衝突と PrimitiveComponent

衝突 PrimitiveComponent では、アクタに関連付けたものすべてについて衝突テストを実施しますが、アクタが移動する場合のテスト対象は PrimitiveComponent だけです。この PrimitiveComponent を選択するには、アクタプロパティの CollisionComponent (衝突コンポーネント) で、アクタの移動衝突チェックに使用するコンポーネントを参照するように設定します。アクタが移動すると、CollisionComponent が参照するコンポーネントの境界ボックスを利用してすべての衝突 PrimitiveComponent に対してスイープします。

ビルトイン コンポーネント タイプ

    • 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 のいずれかが呼びだされます。

UpdateTransform

UActorComponent::UpdateTransform は移動を関連付けたコンポーネントを変更する度に呼び出されます。この前に必ず SetParentToWorld に呼ばれ、関連付けていないコンポーネントに呼びだされることはありません。

Detach

UActorComponent::Detach はコンポーネントが切り離されたときに呼び出されます。関連付けていないコンポーネントで呼出されることはありません。

IsValidComponent

UActorComponent::IsValidComponent は、コンポーネントのプロパティに対してパラメータの検証を補足的に行う場合、オーバーライドされます。返り値がFalseの場合、コンポーネントは関連付けられません。

追加ノート

関連づけ

以前はUE2 では骨格メッシュボーンにアクタが関連付けができるようになっていました。そのため、UE3 では骨格メッシュボーンにアクタコンポーネントが関連付けができるようになっています。 関連付けにはComponents 配列にコンポーネントを追加するより SkeletalMeshComponentのデフォルトプロパティにAttachments 配列にエントリを追加します。インスタンス化された参照はコンポーネントに追加され、 SkeletalMeshComponentのAttachComponent とDetachComponent functionsを使用しているスクリプトにコンポーネントを関連付けします。

ガーベジコレクション

一般的に、 破壊 されたアクタはリストに追加されます。定期的に(iniオプションTimeBetweenPurgingPendingKillObjectsを基に)、リストのアクタへの参照をクリアし、アクタにスペースを作りリストを空にします。 アクタコンポーネントの削除はアクターガーベジコレクションの拡張機能です。コンポーネントはアクタと共に削除されます。アクタからコンポーネントの参照は、コンポーネントが削除される前にクリアされます。

詳細については ガーベジコレクション をご覧ください。