码迷,mamicode.com
首页 > 其他好文 > 详细

(转载)虚幻引擎3--Actor 组件

时间:2016-11-26 18:10:42      阅读:263      评论:0      收藏:0      [点我收藏+]

标签:系统   icm   space   移动   apple   清空   objects   网格   dea   

档概要:关于使用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到那些组件的引用。

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

(转载)虚幻引擎3--Actor 组件

标签:系统   icm   space   移动   apple   清空   objects   网格   dea   

原文地址:http://www.cnblogs.com/wodehao0808/p/6104457.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!