当前位置: 首页 > article >正文

UE使用C++通过定时器启用和停用Tick

写在前面 

       PrimaryActorTick.bCanEverTick这个赋值为true也好,false也好,好像只能在构造函数里面起作用,应该就是当在构造函数里面执行

PrimaryActorTick.bCanEverTick = true;

之后,UE会在BeginPlay阶段自动执行

PrimaryActorTick.RegisterTickFunction(GetLevel());

就是自动注册了Tick方法。

        Tick注销的办法是

PrimaryActorTick.UnRegisterTickFunction();

        做了一段Actor自动上升的控制,通过计时器不断将Tick方法进行注册和注销,让Actor一会上升,一会儿停止。

启用和停用Tick的代码示例

.h文件代码:

#pragma once

#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "DrawLine3D.generated.h"

UCLASS()
class LEARNINGBP00_API ADrawLine3D : public AActor
{
	GENERATED_BODY()
	
private:
	UStaticMesh* SM_Knot;
	UMaterial* matA;
	UStaticMeshComponent* StaticMeshA;

public:	
	ADrawLine3D();

protected:
	virtual void BeginPlay() override;

public:

	virtual void Tick(float DeltaTime) override;

	FTimerHandle timeHandleA;
	FTimerHandle timeHandleB;

    //注册Tick的方法
	void RegisterTick();
    //注销Tick的方法
	void UnRegisterTick();
};

.cpp文件代码:

#include "DrawLine3D.h"

ADrawLine3D::ADrawLine3D()
{
	SM_Knot = Cast<UStaticMesh>(StaticLoadObject(UStaticMesh::StaticClass(), NULL, TEXT("/Game/FBX/Knot")));
	matA = Cast<UMaterial>(StaticLoadObject(UMaterial::StaticClass(), NULL, TEXT("/Game/Material/MatA")));
	StaticMeshA = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("StaticMeshA"));
	StaticMeshA->SetStaticMesh(SM_Knot);
	StaticMeshA->SetMaterial(0, matA);

	PrimaryActorTick.bCanEverTick = true;//这个应该是只能在构造函数里面起作用。
}

void ADrawLine3D::BeginPlay()
{
	Super::BeginPlay();

    //通过定时器设置每隔6秒注销Tick
	GetWorldTimerManager().SetTimer(timeHandleA, this, &ADrawLine3D::UnRegisterTick, 6, true, 2);
    //通过定时器设置每隔6秒注册Tick
	GetWorldTimerManager().SetTimer(timeHandleB, this, &ADrawLine3D::RegisterTick, 6, true, 5);
}

void ADrawLine3D::Tick(float DeltaTime)
{
	Super::Tick(DeltaTime);
    
    //Actor以每秒10个单位的速度上升
	AddActorLocalOffset(FVector(0, 0, 10 * DeltaTime));
}

void ADrawLine3D::RegisterTick() 
{
	PrimaryActorTick.RegisterTickFunction(GetLevel());
	GEngine->AddOnScreenDebugMessage(-256, 2, FColor::Blue, FString("RegisterTick"));
}

void ADrawLine3D::UnRegisterTick() 
{
	PrimaryActorTick.UnRegisterTickFunction();
	GEngine->AddOnScreenDebugMessage(-111, 2, FColor::Red, FString("UnRegisterTick"));
}


http://www.kler.cn/a/147818.html

相关文章:

  • 一文了解Android中的AudioFlinger
  • 无人机应用场景:石油管道巡检技术详解
  • 如何在Mac上切换到JDK 17开发环境
  • 会话信息处理: HttpSession、token序列化、收集登录设备信息、基于`spring-session-data-redis`实现session共享。
  • GPT-5 要来了:抢先了解其创新突破
  • Servlet入门 Servlet生命周期 Servlet体系结构
  • Vue3水印(Watermark)
  • linux防火墙免费版添加UA屏蔽某些垃圾蜘蛛
  • linux 内核线程
  • dpkg、apt、rpm、yum、dnf使用
  • css优化滚动条样式
  • 【Kotlin】类与接口
  • vue3 终端实现 (vue3+xterm+websocket)
  • ubuntu 安装python3.13
  • React自定义 Hook
  • 人工智能-优化算法和深度学习
  • Android Studio导入项目一直显示正在下载Gradle项目
  • 将图像的rgb数据转成DICOM医学图像格式
  • Git介绍和基础命令解析
  • 玩转微服务-技术篇-JSDOC教程
  • nvm安装以及解决踩坑
  • Java后端使用XWPFDocument生成word文档,踩坑
  • 【心得】XXE漏洞利用个人笔记
  • Python3.6.8升级Python3.12.0版本小记
  • Xshell远程登录AWS EC2 Linux实例
  • Linux—进程状态、僵尸进程、孤独进程、优先级