您的位置:首页 > 产品设计 > UI/UE

UE4基础:Gameplay框架(三)Actor 类(5月27日 更新)

2020-06-02 04:15 471 查看

本文是老王学习UE4的笔记,如有错误敬请指正

文章目录

概述

AActor
继承于
UObject
是所有可以放置到场景中的对象的基类。Gameplay框架的核心基类之一。

UCLASS声明

AActor
UCLASS
已经声明了
BlueprintType, Blueprintable
这两个属性都可以传递给子类。

UCLASS(BlueprintType, Blueprintable, config=Engine, meta=(ShortTooltip="An Actor is an object that can be placed or spawned in the world."))
class ENGINE_API AActor : public UObject
{
GENERATED_BODY()
...
}

生命周期

protected:
virtual void BeginPlay() override;
virtual void EndPlay(const EEndPlayReason::Type EndPlayReason) override;
public:
virtual void Tick(float DeltaTime) override;

Tick
相当于Unity中的
Update
,UE4中的
Tick
可以通过
PrimaryActorTick.bCanEverTick
来开关。

virtual void Tick( float DeltaSeconds );
FORCEINLINE bool CanEverTick() const { return PrimaryActorTick.bCanEverTick; }
UPROPERTY(EditDefaultsOnly, Category=Tick)
struct FActorTickFunction PrimaryActorTick;

获取ULevel和UGameInstance

UWorld
UObject
中就可以获取

  • 获取所属
    ULevel
ULevel* GetLevel() const;
  • 获取
    UGameInstance
class UGameInstance* GetGameInstance() const;

Actor的名字

//定义在基类UObjectBaseUtility中
public:
FORCEINLINE FString GetName() const
{
return GetFName().ToString();
}

和组件相关的一些内容

AActor
有3个管理组件的容器

  • OwnedComponents
    :集合
  • InstanceComponents
    :数组
  • BlueprintCreatedComponents
    数组

另外还有一个重要的

RootComponent
组件

  • 它是所有其它组件的根组件
  • 它一定是
    USceneComponent
    类型即带有变换的组件
private:
TSet<UActorComponent*> OwnedComponents;
UPROPERTY(Instanced)
TArray<UActorComponent*> InstanceComponents;
public:
UPROPERTY(TextExportTransient, NonTransactional)
TArray<UActorComponent*> BlueprintCreatedComponents;
protected:
UPROPERTY(BlueprintGetter=K2_GetRootComponent, Category="Utilities|Transformation")
USceneComponent* RootComponent;
public:
FORCEINLINE USceneComponent* GetRootComponent() const { return RootComponent; }

和场景中的AActor树相关的一些内容

private:
UPROPERTY(ReplicatedUsing=OnRep_Owner)
AActor* Owner;
public:
UPROPERTY(Transient)
TArray<AActor*> Children;

UFUNCTION(BlueprintCallable, Category=Actor)
AActor* GetOwner() const;

UFUNCTION(BlueprintCallable, Category=Actor)
virtual void SetOwner( AActor* NewOwner );

和蓝图中的AActor树相关的一些内容

UFUNCTION(BlueprintCallable, Category="Actor")
AActor* GetParentActor() const;

UFUNCTION(BlueprintCallable, Category="Actor")
UChildActorComponent* GetParentComponent() const;

一些奇葩的地方

  • AActor
    应该是抽象层次很高的类,里面竟然有关于伤害的定义
  • 竟然还引用了子类
    APawn
    ACharacter
  • UInputComponent
    也应该是在
    APawn
    层级才有交集
/**
* Whether this actor can take damage. Must be true for damage events (e.g. ReceiveDamage()) to be called.
* @see https://www.unrealengine.com/blog/damage-in-ue4
* @see TakeDamage(), ReceiveDamage()
*/
UPROPERTY(EditAnywhere, BlueprintReadWrite, SaveGame, Replicated, Category=Actor, meta=(AllowPrivateAccess="true"))
uint8 bCanBeDamaged:1;
private:
/** Pawn responsible for damage and other gameplay events caused by this actor. */
UPROPERTY(BlueprintReadWrite, ReplicatedUsing=OnRep_Instigator, meta=(ExposeOnSpawn=true, AllowPrivateAccess=true), Category=Actor)
class APawn* Instigator;
UPROPERTY(DuplicateTransient)
class UInputComponent* InputComponent;
/**
* Return true if the given Pawn can be "based" on this actor (ie walk on it).
* @param Pawn - The pawn that wants to be based on this actor
*/
virtual bool CanBeBaseForCharacter(class APawn* Pawn) const;

/**
* Apply damage to this actor.
* @see https://www.unrealengine.com/blog/damage-in-ue4
* @param DamageAmount		How much damage to apply
* @param DamageEvent		Data package that fully describes the damage received.
* @param EventInstigator	The Controller responsible for the damage.
* @param DamageCauser		The Actor that directly caused the damage (e.g. the projectile that exploded, the rock that landed on you)
* @return					The amount of damage actually applied.
*/
virtual float TakeDamage(float DamageAmount, struct FDamageEvent const& DamageEvent, class AController* EventInstigator, AActor* DamageCauser);

protected:
virtual float InternalTakeRadialDamage(float Damage, struct FRadialDamageEvent const& RadialDamageEvent, class AController* EventInstigator, AActor* DamageCauser);
virtual float InternalTakePointDamage(float Damage, struct FPointDamageEvent const& PointDamageEvent, class AController* EventInstigator, AActor* DamageCauser);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: