【UE4 C++】 Tick的三种方式、异步蓝图节点

时间:2021-06-02 14:18:53   收藏:0   阅读:0

Tick的三种方式

class  FTickableObject :public FTickableGameObject
{
public:
	bool bEnableTick = false;
	int32 TickCounter = 0;

	virtual void Tick(float DeltaTime)override {
		UE_LOG(LogTemp, Warning, TEXT(__FUNCTION__"\t [TickCounter]%d"), TickCounter);
	}
	virtual bool IsTickable()const override { return bEnableTick; }
	virtual TStatId GetStatId() const override { RETURN_QUICK_DECLARE_CYCLE_STAT(UTickableObject, STATGROUP_Tickables); }
};

UCLASS()
class DESIGNPATTERNS_API AAsyncTickActor : public AActor
{
	GENERATED_BODY()
public:	
	// Sets default values for this actor‘s properties
	AAsyncTickActor();

	// Called every frame
	virtual void Tick(float DeltaTime) override;
	void TimerTick();
protected:
	// Called when the game starts or when spawned
	virtual void BeginPlay() override;

private:
	int32 TickCounter = 0;
	FTimerHandle TimeHandle;
	TSharedPtr<FTickableObject> TickableObject;
};
AAsyncTickActor::AAsyncTickActor()
{
 	// Set this actor to call Tick() every frame.  You can turn this off to improve performance if you don‘t need it.
	PrimaryActorTick.bCanEverTick = true;	
}

// Called when the game starts or when spawned
void AAsyncTickActor::BeginPlay()
{
	Super::BeginPlay();
	TickableObject = MakeShareable(new FTickableObject());
	TickableObject->bEnableTick = true;
	GetWorld()->GetTimerManager().SetTimer(TimeHandle, this, &AAsyncTickActor::TimerTick, 0.1f, true);
}

// Called every frame
void AAsyncTickActor::Tick(float DeltaTime)
{
	Super::Tick(DeltaTime);
	UE_LOG(LogTemp, Warning, TEXT(__FUNCTION__"\t[TickCounter]%d"), TickCounter);
	if (TickableObject.IsValid())
	{
		TickableObject->TickCounter = TickCounter;
	}

}

void AAsyncTickActor::TimerTick()
{
	TickCounter++;
	UE_LOG(LogTemp, Warning, TEXT(__FUNCTION__"%\t [TickCounter]%d"), TickCounter);
}

异步蓝图节点

技术图片

使用方法

代码实现

评论(0
© 2014 mamicode.com 版权所有 京ICP备13008772号-2  联系我们:gaon5@hotmail.com
迷上了代码!