您当前的位置: 首页 > 

开发游戏的老王

暂无认证

  • 2浏览

    0关注

    803博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

虚幻引擎图文笔记:Gameplay框架(三)Actor 类(5月27日 更新)

开发游戏的老王 发布时间:2020-05-26 18:24:48 ,浏览量:2

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

文章目录
      • 概述
      • UCLASS声明
      • 生命周期
      • 获取ULevel和UGameInstance
      • Actor的名字
      • 和组件相关的一些内容
      • 和场景中的AActor树相关的一些内容
      • 和蓝图中的AActor树相关的一些内容
      • 一些奇葩的地方

概述

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

UCLASS声明

AActorUCLASS已经声明了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

UWorldUObject中就可以获取

  • 获取所属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 OwnedComponents;
	UPROPERTY(Instanced)
	TArray InstanceComponents;
public:
	UPROPERTY(TextExportTransient, NonTransactional)
	TArray 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 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应该是抽象层次很高的类,里面竟然有关于伤害的定义
  • 竟然还引用了子类APawnACharacter
  • 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);
	
关注
打赏
1656935939
查看更多评论
立即登录/注册

微信扫码登录

0.0412s