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

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

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

时间: 2024-10-05 22:49:06

(转载)虚幻引擎3--Actor 组件的相关文章

(转载)虚幻引擎3--基础知识

这是虚幻引擎3UDN的技术文档,共有六个章节.以下将分别把中文译本贴出来,方便懒人学习[偷笑]  一.虚幻引擎 3 基础知识 概述 -------------------------------------------------------------------- 有几个游戏性元素实际上是所有使用虚幻引擎3或虚幻开发工具包创建的项目所共有的.自定义这些元素可以创建出完全独特的.外观和行为符合期望的游戏.没有任何两个项目是相同的,尽管虚幻引擎提供了这些元素的默认实现,但是肯定需要对它们进行很大

(转载)虚幻引擎3--Unrealscript(US)虚幻脚本代理Delegates

https://udn.epicgames.com/Three/UnrealScriptDelegates.html 概述 一个代理是到一个绑定到对象上的函数的引用.它们的主要用途是提供函数调用机制,比如,在用户界面系统中提供事件通知. 声明代理 您需要做的第一件事情是声明一个代理.代理声明看上去和事件声明类似.例如: Class Button extends Window; delegate OnClick( Button B, int MouseX, int MouseY ); 将代理作为函

(转载)虚幻引擎3--UDK常用函数汇总--比较详细解释了一些类中的函数(有用,星月自己备注)

转自:http://www.mamicode.com/info-detail-590692.html foreach [用来遍历游戏中的数据,使用方法如下] local StaticMeshActor myActor; foreach AllActors(class'StaticMeshActor',myActor) { if(myActor.Tag == 'Box') { myActorSize.X = 1; myActorSize.Y = myActor.DrawScale3D.Y; myA

(转载)虚幻引擎3--6掌握虚幻技术UnrealScript 函数

第六章 –函数 6.1概述 指南 6.1环境生物, 第一部分:基类声明 指南 6.2 环境生物, 第二部分:类的变量声明 指南 6.3 环境生物,第三部分:渲染及光照组件 指南 6.4 环境生物, 第四部分:碰撞及物理属性 6.2 函数声明 指南 6.5 环境生物, 第五部分:       SETRANDDEST() 函数 6.3函数修饰符 Static Native Final Singular NoExport Exec Latent Iterator Simulated Server Cl

(转载)虚幻引擎3--11掌握虚幻技术UnrealScript 状态

第 11章 – STATES (状态) 11.1什么是状态编程 11.2虚幻引擎3中的状态 AUTO 关键字 IGNORES 关键字 SUPER        & GLOBAL 关键字 11.3 -基本的状态转换 GOTOSTATE GOTO STATE        EVENTS BEGINSTATE ENDSTATE 指南 11.1 – 状态触发器, 第一部分:函数重载 11.4 -状态继承 扩展状态 指南 11.2 –状态触发器, 第二部分:状态继承 指南11.3 – 状态触发器, 第三部

(转载)虚幻引擎3--第六章 –函数

第六章 –函数 6.1概述 指南 6.1环境生物, 第一部分:基类声明 指南 6.2 环境生物, 第二部分:类的变量声明 指南 6.3 环境生物,第三部分:渲染及光照组件 指南 6.4 环境生物, 第四部分:碰撞及物理属性 6.2 函数声明 指南 6.5 环境生物, 第五部分: SETRANDDEST() 函数 6.3函数修饰符 Static Native Final Singular NoExport Exec Latent Iterator Simulated Server Client R

(转载)虚幻引擎3--13掌握虚幻技术UnrealScript 接口

第十三章 – 接口 什么是接口? 接口示例 USB 电脑鼠标 电源插座 编程说明 定义接口 声明和定义 接口继承 实现接口 为什么使用接口? 结束语 指南 13.1 – 指南针, 第一部分:指南针接口 指南 13.2 –指南针, 第二部分:指南针类的实现 指南 13.3 –指南针, 第三部分: 测试指南针, 第一部分 指南 13.4 – 小地图, 第一部分:       MU_MINIMAP 类 指南 13.5 – 小地图, 第二部分: MINIMAPGAME 类 指南 13.6 – 小地图,

(转载)虚幻引擎3--12掌握虚幻技术UnrealScript 代理

第十二章- DELEGATES(代理) 12.1 –概述 12.2 - 声明代理(Delegate) 代理参数 默认行为 12.3 - 代理变量 12.4 - 传递Delegate(代理)给函数 12.5 - 代理和内存 12.6 -       UISCENE 和 UIOBJECT       DELEGATES(代理) UISCENE 代理 UIOBJECT 的代理 12.7 – 虚幻引擎3和虚幻竞技场3中的其它代理 AUDIOCOMPONENT GAMEINFO GAMEVIEWPORTC

(转载)虚幻引擎3--UnrealScript语言参考

档概要: UnrealScript 介绍和简要参考.最初作者是Tim Sweeney (EpicGames) 内容 UnrealScript语言参考 介绍 快速链接 本文档的目的 UnrealScript的设计目标 虚幻引擎3中UnrealScript的新功能 代码结构示例 Unreal虚拟机 对象层次 类 变量 变量类型 内置类型 集合数据类型 Unreal类型 变量修饰符 可编辑性 数组 Structs 修饰符 枚举 常量 Object和actor引用变量 类引用变量 表达式 赋值 在类之间