档概要:关于使用ActorComponents 及创建自定义ActorComponent 类型的解释说明。
文档变更记录:由Andrew Scheidecker创建;由Scott Sherman 和 Matt Oelfke更新;并将会不断地进行维护。
概述
在虚幻引擎中,所有游戏相关的物体都是从基类Actor继承而来。在之前一代的虚幻引擎中,基类Actor是非常重量级的,不论Actor的属性行为是什么,任何从Actor衍生而来的类将会继承它的所有属性。
Actor组件通过定义多个轻量级组件来解决这个问题,轻量级组件用于为Actor渲染和碰撞的模块化扩展提供接口。
通过使用在虚幻引擎2中先前定义的子对象语法的修改版本,我们把组件原型定义在类的默认属性中。命名原型,并使得一个子类继承该原型。子类可以覆盖原型的某些或所有默认属性。要想使用组件,可以通过默认属性把它添加到Actor的组件(Component)数组中。在默认属性中引用的组件原型是和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类的默认属性所引用,所以它将不会被在跟着StaticMeshActors一同进行实例化。
组件模板
组件模板用于声明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 启用了碰撞,则BlockActors 决定了图元的碰撞是否阻挡其它actors。 |
boolean | CastShadow | 如果PrimitiveComponent 要投射阴影时,设置这项为True;如果它不投射阴影时,设置这项为false。 |
boolean | CollideActors | 如果actor的bCollideActors 或PrimitiveComponent 的CollideActors 属性中的任何一个为false,那么图元将没有碰撞。 |
boolean | HiddenEditor | 如果需要在编辑器中渲染PrimitiveComponent ,那么设置它为False;如果不需要渲染,则设置它为True。 |
boolean | HiddenGame | 如果需要在游戏中渲染PrimitiveComponent ,那么设置它为False;如果不需要渲染,则设置它为True。 |
Actor 碰撞和PrimitiveComponents(图元组件)
对于附加到actor 上的所有碰撞PrimitiveComponents(图元组件)都要执行碰撞测试,但是当actor移动时,它将仅对一个单独的PrimitiveComponent(图元组件)执行测试。这个PrimitiveComponent通过设置Actor属性 CollisionComponent 指向用于actor运动的碰撞检测的组件来选择。当actor移动时,它将会获取CollisionComponent所引用的组件的包围盒,然后使用它对所有的碰撞PrimitiveComponents进行检测。
内置的组件类型
- 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
U当分离组件时调用UActorComponent::Detach。将永远不会在没有附加的组件上调用这个函数
IsValidComponent
可以重写 UActorComponent::IsValidComponent函数来在组件属性上执行额外的参数验证。如果返回值为false,那么将不会附加组件。
其它注意事项
附加
先前,在虚幻引擎2中可以把Actors附加到骨架网格物体的骨骼上。但虚幻引擎3仅允许把Actor组件附加到骨架网格物体骨骼上。
对于附加来说,不是指把组件添加到Components(组件)数组中,而是向SkeletalMeshComponent的默认属性汇总的Attachments数组中添加一个元素。可替换地,可以像组件中添加一个实例化的引用,然后在脚本中使用SkeletalMeshComponent的AttachComponent和DetachComponent函数来附加组件。
垃圾回收
一般, 被销毁的 Actors会被添加到一个列表中。它周期性地(基于ini选项TimeBetweenPurgingPendingKillObjects) 清除到列表中的actors的引用,释放actors并清空列表。
Actor Components(Actor组件)的删除是Actor垃圾回收的一个扩展。组件会随着它们的Actor的删除而删除。在删除组件之前将会清除从Actors到那些组件的引用。
请参照垃圾回收页面获得更多信息。