UE4 Gameplay(一):Actor和Component

10/07/2020

文章目录

  • 前言
  • UObject
  • Actor
    • Actor转发能力
      • Actor的Get/SetActorLocation代码
    • Actor之间的父子关系
  • Component
    • Actor和Component关系
  • 总结
  • 参考

前言

如何入门UE4的游戏玩法,我们需要去了解UE4给我们提供了什么,本笔记学习了知乎上的《InsideUE4》专栏。本人接触UE4二个月不到,我将以我的视角,记录学习UE4。

《InsideUE4》

UObject

UE4 Gameplay(一):Actor和Component_第1张图片
UObject是一个很丰富的类,提供元数据,反射生成,GC垃圾回收,序列化,编辑器可见等等。

Actor

UE4 Gameplay(一):Actor和Component_第2张图片
Actor派生于UObject,Actor即演员,可以存在关卡之中,同时有网络复制,Spawn和Tick功能。Actor之间具有嵌套功能。

Actor转发能力

USceneComponent 具有Transform属性,当Actor的位置,方位,大小需要改变的时候,通常更新USceneComponent。UInputComponent提供处理输入相关的问题。

  • Get/SetActorLocation 转发给USceneComponent
  • 接受处理Input能力转发给UInputComponent

Actor是一个容器,Component维护父子关系

Actor的Get/SetActorLocation代码

首先第一步判断是否USceneComponent是否为空,进而更新或者改变它的位置

/*~
 * Returns location of the RootComponent 
 * this is a template for no other reason than to delay compilation until USceneComponent is defined
 */ 
template<class T>
static FORCEINLINE FVector GetActorLocation(const T* RootComponent)
{
    return (RootComponent != nullptr) ? RootComponent->GetComponentLocation() : FVector(0.f,0.f,0.f);
}
bool AActor::SetActorLocation(const FVector& NewLocation, bool bSweep, FHitResult* OutSweepHitResult, ETeleportType Teleport)
{
    if (RootComponent)
    {
        const FVector Delta = NewLocation - GetActorLocation();
        return RootComponent->MoveComponent(Delta, GetActorQuat(), bSweep, OutSweepHitResult, MOVECOMP_NoFlags, Teleport);
    }
    else if (OutSweepHitResult)
    {
        *OutSweepHitResult = FHitResult();
    }
    return false;
}

Actor之间的父子关系

首先并没有AddChild函数,UE4里,Actor之间的父子关系确实通过Component来确定的,有AttachToActor和AttachToComponent来创建父子链接

Component

Component组装到Actor类中,用来表示不同的功能,也可以随时拆卸。即放弃继承,改用组合。UActorComponent派生于UObject。

Actor和Component关系

TSet OwnedComponents 保存了Actor所拥有的所有组件;TArray InstanceComponents 保存了实例化的组件。

实例化:蓝图里Details定义的Component,即武器与实例化的剑刀等等
UE4 Gameplay(一):Actor和Component_第3张图片

总结

Actor其实更像是一个容器,只提供了基本的创建销毁,网络复制,事件触发等一些逻辑性的功能,而把父子的关系维护都交给了具体的Component,所以更准确的说,其实是不同Actor的SceneComponent之间有父子关系,而Actor本身其实并不太关心。

参考

InsideUE4

你可能感兴趣的:(UE4,Gameplay入门,游戏开发,UE4)