UE4使用定时器

这篇具有很好参考价值的文章主要介绍了UE4使用定时器。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

上面的文章中,我们创建了一个门,并且当人才上去的时候,门就会打开,当离开的时候,门就自动关闭了。大概但是我们希望当我们离开以后,至少还要有一段时间才能关闭,这时就用到了定时器。

  1. 定义一个定时器句柄
FTimerHandle switchTimer;
  1. 使用定时器
GetWorldTimerManager().SetTimer(switchTimer, this, &AFloorSwitch::closeTheDoor, 2.0);

第一个参数:把时间控制权交给谁,TimeHandle
第二个参数: 哪个类的对象
第三个参数: 时间到时执行的函数指针,(去执行closeTheDoor()函数)
第四个参数: 间隔多久(2s)去执行closeTheDoor()函数
第五个参数: false - 只执行一次 true - 循环执行

// 清空
GetWorldTimerManager().ClearTimer(switchTimer);
// 暂停
GetWorldTimerManager().PauseTimer(switchTimer);
// 结束暂停
GetWorldTimerManager().UnPauseTimer(switchTimer);
// Fill out your copyright notice in the Description page of Project Settings.

#pragma once

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

UCLASS()
class FIRSTPROJECT_API AFloorSwitch : public AActor
{
	GENERATED_BODY()
	
public:	
	// Sets default values for this actor's properties
	AFloorSwitch();

	//触发盒子
	UPROPERTY(VisibleAnywhere, BlueprintReadWrite, Category="FloorSwitch")
	class UBoxComponent* traggerBox = nullptr;

	//地板开关
	UPROPERTY(VisibleAnywhere, BlueprintReadWrite, Category = "FloorSwitch")
	class UStaticMeshComponent* floorSwitch = nullptr;

	//门
	UPROPERTY(VisibleAnywhere, BlueprintReadWrite, Category = "FloorSwitch")
	class UStaticMeshComponent* door = nullptr;


	UFUNCTION()
	void onBeginOverlap(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult&SweepResult);

	UFUNCTION()
	void onEndOverlap(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent*OtherComp, int32 OtherBodyIndex);

	UFUNCTION(BlueprintImplementableEvent, Category="FloorSwitch")
	void riseDoor();
	UFUNCTION(BlueprintImplementableEvent, Category = "FloorSwitch")
	void lowerDoor();

	//门的初始位置
	UPROPERTY(BlueprintReadWrite, Category = "FloorSwitch")
	FVector initDoorLocation;

	//地板开关的初始位置
	UPROPERTY(BlueprintReadWrite, Category = "FloorSwitch")
	FVector initFloorSwitchLocation;

	UFUNCTION(BlueprintImplementableEvent, Category = "FloorSwitch")
	void riseFloorSwitch();
	UFUNCTION(BlueprintImplementableEvent, Category = "FloorSwitch")
	void lowerFloorSwitch();

	UFUNCTION(BlueprintCallable, Category="FloorSwitch")
	void updateDoorLocation(float z);

	UFUNCTION(BlueprintCallable, Category = "FloorSwitch")
	void updateFloorSwitchLocation(float z);

private:
	FTimerHandle switchTimer;
	void closeTheDoor();

	bool bIsOnFloor = false;//是否站在地板开关上
protected:
	// Called when the game starts or when spawned
	virtual void BeginPlay() override;

public:	
	// Called every frame
	virtual void Tick(float DeltaTime) override;

};

// Fill out your copyright notice in the Description page of Project Settings.


#include "FloorSwitch.h"
#include "Components/BoxComponent.h"

// Sets default values
AFloorSwitch::AFloorSwitch() {
	// 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;

	traggerBox = CreateDefaultSubobject<UBoxComponent>(TEXT("TriggerBox"));
	RootComponent = traggerBox;

	traggerBox->SetCollisionEnabled(ECollisionEnabled::QueryOnly);//只检测碰撞事件
	traggerBox->SetCollisionObjectType(ECC_WorldStatic);//设置对象类型
	traggerBox->SetCollisionResponseToAllChannels(ECollisionResponse::ECR_Ignore);//忽略所有通道
	traggerBox->SetCollisionResponseToChannel(ECC_Pawn, ECR_Overlap);//对Pawn类型开放事件重叠事件

	traggerBox->SetBoxExtent(FVector(50.0, 50.0, 50.0));

	floorSwitch = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("FloorSwitch"));
	floorSwitch->SetupAttachment(GetRootComponent());

	door = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("Door"));
	door->SetupAttachment(GetRootComponent());

}

void AFloorSwitch::onBeginOverlap(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult) {
	UE_LOG(LogTemp, Warning, TEXT("AFloorSwitch::onBeginOverlap"));
	riseDoor();
	lowerFloorSwitch();

	bIsOnFloor = true;
}

void AFloorSwitch::onEndOverlap(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex) {
	UE_LOG(LogTemp, Warning, TEXT("AFloorSwitch::onEndOverlap"));
	bIsOnFloor = false;
	GetWorldTimerManager().SetTimer(switchTimer, this, &AFloorSwitch::closeTheDoor, 2.0);
}

void AFloorSwitch::updateDoorLocation(float z) {
	FVector newLocation = initDoorLocation;
	newLocation.Z += z;
	door->SetWorldLocation(newLocation);
}

void AFloorSwitch::updateFloorSwitchLocation(float z) {
	FVector newLocation = initFloorSwitchLocation;
	newLocation.Z += z;
	floorSwitch->SetWorldLocation(newLocation);
}

void AFloorSwitch::closeTheDoor() {
	if (!bIsOnFloor){
		riseFloorSwitch();
		lowerDoor();
	}
}

// Called when the game starts or when spawned
void AFloorSwitch::BeginPlay() {
	Super::BeginPlay();

	//绑定事件
	traggerBox->OnComponentBeginOverlap.AddDynamic(this, &AFloorSwitch::onBeginOverlap);
	traggerBox->OnComponentEndOverlap.AddDynamic(this, &AFloorSwitch::onEndOverlap);

	initDoorLocation = door->GetComponentLocation();
	initFloorSwitchLocation = floorSwitch->GetComponentLocation();
}

// Called every frame
void AFloorSwitch::Tick(float DeltaTime) {
	Super::Tick(DeltaTime);

}


aaa文章来源地址https://www.toymoban.com/news/detail-646415.html

到了这里,关于UE4使用定时器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • UE4/5 行为树使用教程

    使用行为树需确保目标蓝图继承自Character基类,然后根据本文下面的流程操作即可。 首先需要在 角色自身蓝图之外 创建一个新的蓝图,继承自AIController: 找到角色自身蓝图类 设置中的Pawn一栏 ,挂载刚刚创建的控制器蓝图: 创建行为树文件,添加Sequence节点,可以单击Ne

    2024年02月15日
    浏览(39)
  • UE4使用蓝图材质改变颜色

    1.点击场景中的物体,找到他的材质,点击放大镜找到材质的位置并进入。 2.找到材质的父亲,并进入。  3.该变材质的颜色只要改变材质的Base Color就行。创建一个MaterialParameterCollection 添加一个vector paramter,并给它命名保存。  拖动它进入材质的父亲,点击它修改左边的par

    2024年02月12日
    浏览(58)
  • (UE4/UE5)Unreal Engine中使用HLOD

    本教程将详细介绍在Unreal Engine的不同版本(4.20-4.24、4.25-4.26、5.2)中如何使用Hierarchical Level of Detail (HLOD)。注意,每个版本中使用HLOD的方法可能会有所不同。 步骤一:预先生成LOD打开UE4.21,点击Content Browser(内容浏览器)中你想要生成LOD的静态网格。 步骤二:在静态网格编

    2024年02月10日
    浏览(51)
  • UE4 Take Recorder的使用

    1.设置镜头片段编号、帧率 2.添加要录制的对象 3.如果勾上,就会创建如下图的关卡序列文件 4.如果勾上,创建的关卡序列文件会自动锁定。可点击红框锁图标处解锁 5.选择“可拥有”,就不会实例化生成一个Light Source,勾选需要录制的属性 6.开始录制 7.记得保存你的预设。

    2024年02月12日
    浏览(51)
  • 使用UE4 HttpRequest提交多表单

    大部分HTTP库都是支持直接设置多表单字段的,但UE4的HttpRequest比较惨,只能用SetContent设置整个的TArrayuint8作为请求体,所以想要传多表单就要自己拼。 首先设置Header,Content-Type设置为多表单,并设置boundary: boundary想设什么都行,但要和后面用的统一。 然后拼请求体的数据字

    2024年02月07日
    浏览(39)
  • 【虚幻引擎UE】UE4/UE5 GIS辅助类插件推荐及使用介绍

    此插件将虚幻引擎连接到Speckle,允许从Speckle接收版本化的3D数据,可以实现Revit、Rhino、Blender、Sketchup、Unity、虚幻引擎、AutoCAD等之间的完全互操作协作。 这是一个涵盖了在展厅、工业产品或其他3D场景中导航的许多可能性的系统。在窗口、触摸屏、手机和Html5上。 只需快速

    2024年02月07日
    浏览(103)
  • 【虚幻引擎UE】UE4/UE5 功能性插件推荐及使用介绍 1

    实现POST/GET基本方法,并支持HEAD带信息。 使用案例:【虚幻引擎UE】UE5 三种模式调用API详解(案例基于免费Varest插件) 能够快速实现打开对话框获取数据的导入、导出路径。 某月限免插件,比较方便的地图插件,可以改改样式直接用。 http下载数据到指定路径 按空格可以切

    2023年04月11日
    浏览(108)
  • 【虚幻引擎UE】UE4/UE5 功能性插件推荐及使用介绍 2

    (基于UE5 的Python支持插件) 支持Python语言基于UE5进行开发 GIT地址:https://github.com/mamoniem/UnrealEditorPythonScripts (基于UE5 的Haxe支持插件) Haxe是一门新兴的开源编程语言,是一种开源的编程语言。支持Haxe语言基于UE5进行开发。 GIT地址:https://github.com/RobertBorghese/Haxe-UnrealEngine

    2024年02月06日
    浏览(97)
  • UE4/5Niagara粒子特效学习(使用UE5.1,适合新手)

    目录 创建空模板 创建粒子 粒子的基础属性 粒子的生命周期 颜色  大小设置 生成的位置 Skeletal Mesh Location的效果: Shape Location 添加速度 添加Noise力场 在生成中添加: 效果:  ​编辑 在更新中添加: 效果: 控制粒子过程的大小   控制粒子过程的颜色  添加风的立场 结束

    2024年02月12日
    浏览(57)
  • UE4_VaREST使用调用

    UE4_VaREST使用调用 首先说明需要两个插件配合使用,分别是VaRest和JsonBlueprint,都是免费插件,官方可下载。下载安装过程不再详说,蓝图节点以及参考使用流程见下图。 common SubSystem Response utility event request json json 1. get 2. post 文章参考: UE4如何通过http方式请求接口Json数据

    2024年02月11日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包