UDN
Search public documentation:

ActorComponentsCH
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 主页 > 虚幻脚本 > Actor 组件
UE3 主页 > 游戏性编程 > Actor 组件

Actor 组件


概述


在虚幻引擎中,所有游戏相关的物体都是从基类 Actor 继承而来。在之前一代的虚幻引擎中,基类 Actor 是非常重量级的,不论 Actor 的属性行为是什么,任何从 Actor 衍生而来的类将会继承它的所有属性。

Actor 组件通过定义多个轻量级组件来解决这个问题,轻量级组件用于为 Actor 渲染和碰撞的模块化扩展提供接口。

通过使用在虚幻引擎 2 中先前定义的子对象语法的修改版本,我们把组件原型定义在类的默认属性中。子类可以覆盖原型的某些或所有默认属性。要想使用组件,可以通过默认属性把它添加到 Actor 的组件数组中。在默认属性中引用的组件原型是和 Actor 类一同进行实例化的。默认的属性改变可以被传递到关卡中保存的 Actor 类的所有现有实例上。

使用 Actor 组件


ActorComponent 与 PrimitiveComponent 相比

ActorComponent(Actor 组件)是一个可以附加到世界中的一个 actor 上的对象。

PrimitiveComponent(图元组件)是一个可以进行渲染和碰撞的 ActorComponent(Actor 组件)。

添加一个组件

如果任何实例化的 Actor 具有 SpriteComponent,那么 SpriteComponent 将随同该 Actor 一同进行实例化(除非子类从它的数组中删除了 Sprite)。

组件数组引用的组件是和 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 类的默认属性所引用,所以它将不会被在跟着 StaticMeshActor 一同进行实例化。

组件模板

组件模板用于声明 actor 类的默认组件。 一个组件模板是一个命名对象,它包含了在类的默认属性中的一个组件的默认属性。 当实例化这个类时,则它所引用的组件模板也会随同它进行实例化。

组件模板将会被它们声明所在类的子类所继承。 每个子类可以覆盖继承的模版的单个属性。

组件模板的实例是相对于模版的默认属性来进行实例化的。 这使得在将 actor 组件实例放置到关卡中时,它仍然可以从模板属性中接受改变。

创建组件模板

组件模板在类的默认属性中进行声明:

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

实例化及附加组件模板

除非组件模板被一个类的默认属性所引用,否则它将不会随同那个类进行实例化;并且除非一个 actor 组件在 actor 的组件数组中,否则 actor 组件将不能附加到该 actor 上。 您可以将 actor 组件模板和 actor 类一同进行实例化,并通过在默认属性中把组件模板添加到 actor 的组件数组中来自动地把实例化的组件附加到 actor 实例上。

Begin Object Class=SpriteComponent Name=Sprite
   // Sprite 组件属性在这里进行赋值。
End Object
Components.Add(Sprite)

改变从父类继承而来的组件模板的属性

组件模板将会被最初声明该模板的类的子类所继承。子类可以覆盖继承的模板上的单独的属性。 这个实例从 Actor 类继承了 Sprite 模板,而且只修改了 spirte 贴图属性:

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

动态创建的组件

要想动态创建组件的实例,请使用 UnrealScript 的 new 操作符,并调用 actor 的 AttachComponent 方法来把新的组件附加到 actor 上。

New 操作符的参数是在其中创建组件的外部容器对象;这应该是组件要附加到的 actor。 这样确保了组件的 Outer(外部容器)引用不会再没有对要附加到的 actor 上进行垃圾回收之前不必要地阻止对另一个 actor 进行垃圾回收。

local StaticMeshComponent NewComponent;
NewComponent = new(self) class'StaticMeshComponent';
// 在这里设置静态网格物体组件的属性。
AttachComponent(NewComponent);

要想分离或释放您先前附加的组件,请使用 actor 的 DetachComponent 方法。 只要不存在对这个组件的引用,那么会对它进行垃圾回收。

常用 PrimitiveComponent(图元组件)选项

类型 名称 描述
boolean AlwaysLoadOnClient 在 AlwaysLoadOnClient=False 的情况下,并且图元设置为 HiddenGame=True 和 CollideActors=False,那么将不会在游戏客户端加载图元。
boolean AlwaysLoadOnServer 在 AlwaysLoadOnServer=False 的情况下,并且图元设置为 CollideActors=False,那么将不会在游戏客户端加载图元。
boolean BlockActors 如果 PrimitiveComponent 启用了碰撞,那么 BlockActor 决定了图元的碰撞是否阻挡其它 actor。
boolean CastShadow 在 PrimitiveComponent 要投射阴影的情况下,设置这项为 True;如果它不投射阴影时,将该项设置为 false。
boolean CollideActors 如果 actor 的 bCollideActor 或 PrimitiveComponent 的 CollideActor 属性中的任何一个为 false,那么图元将没有碰撞。
boolean HiddenEditor 如果需要在编辑器中渲染 PrimitiveComponent,那么将它设置为 False;如果不需要渲染,则将它设置为 True。
boolean HiddenGame 如果需要在游戏中渲染 PrimitiveComponent ,那么将它设置为 False;如果不需要渲染,则将它设置为 True。

Actor 碰撞和 PrimitiveComponent(图元组件)

对于附加到 actor 上的所有碰撞 PrimitiveComponent(图元组件)都要执行碰撞测试,但是当 actor 移动时,它将仅对一个单独的 PrimitiveComponent(图元组件)执行测试。 这个 PrimitiveComponent 通过设置 Actor 属性 CollisionComponent 指向用于 actor 运动的碰撞检测的组件来选择。 当 actor 移动时,它将会获取 CollisionComponent 所引用的组件的包围盒,然后使用它对所有的碰撞 PrimitiveComponent 进行检测。

内置的组件类型


  • PrimitiveComponent(图元组件)
    • ArrowComponent(箭头组件)
    • CameraConeComponent(相机锥体组件)
    • CylinderComponent(圆柱体组件)
    • DrawFrustumComponent(描画平截头体组件)
    • MeshComponent(网格物体组件)
      • StaticMeshComponent(静态网格物体组件)
      • SkeletalMeshComponent(骨架网格物体专组件)
    • ParticleSystemComponent(粒子系统组件)
    • SpriteComponent(平面粒子组件)
  • LightComponent(光源组件)
    • DirectionalLightComponent(直接光源组件)
    • PointLightComponent(点光源组件)
      • SpotLightComponent(聚光源组件)
    • SkyLightComponent(天空光源组件)
  • AudioComponent(音频组件)
  • HeightFogComponent(高空雾组件)
  • SceneCaptureComponent(场景截图组件)
    • SceneCapture2DComponent(场景截图 2D 组件)
    • 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 组件附加到骨架网格物体骨骼上。

对于附加来说,不是指把组件添加到 Component(组件)数组中,而是向 SkeletalMeshComponent 的默认属性汇总的 Attachment 数组中添加一个元素。可替换地,可以像组件中添加一个实例化的引用,然后在脚本中使用 SkeletalMeshComponent的AttachComponent 和 DetachComponent 函数来附加组件。

垃圾回收

一般情况下,会将 被销毁的 Actor 添加到一个列表中。它周期性地(基于 ini 选项 TimeBetweenPurgingPendingKillObjects)清除到列表中的 actor 的引用,释放 actor 并清空列表。

Actor Components(Actor 组件)的删除是 Actor 垃圾回收的一个扩展。组件会随着它们的 Actor 的删除而删除。在删除组件之前将会清除 Actor 对那些组件的引用。

请参照垃圾回收页面获得更多信息。