阿赵UE引擎C++编程学习笔记——GameMode和生命周期

news2024/11/19 16:27:27

  大家好,我是阿赵。
  之前在介绍HelloWorld的时候,我们很创建了一个MyGameModeBase的c++类,然后就可以在BeginPlay函数里面写打印的HelloWorld。这一篇主要是说一下,GameMode究竟是一个什么东西,然后UE里面的生命周期是怎样的。

一、 GameMode和关卡蓝图

1、C++程序的Main函数

  如果是纯粹的C++项目,按道理都是有一个Main函数作为整个项目的启动入口。UE的C++项目实际上也是有的。不过那个是引擎本身启动的时候调用的,具体的位置在Engine\Source\Runtime\Launch\Private\Launch.cpp里面的GuardedMain函数
在这里插入图片描述

  在这个主入口的函数里面,引擎会做很多事情,比如初始化引擎功能之类。
  所以,写UE的C++不能以Main函数作为我们逻辑的入口。那应该怎么办呢?

2、关卡蓝图

  用过Unity引擎的朋友,可以对比一下Unity引擎的启动方式。在Unity引擎里面的做法,一般是指定一个场景,然后在上面建一个空节点,然后挂一个继承了MonoBehaviour的脚本,通过MonoBehaviour脚本的生命周期自动运行的函数,来进入游戏实际的逻辑。
  和Unity引擎一样,UE引擎在刚开始运行的时候,也是需要指定一个默认的关卡(Level)的。当这个Level被载入并运行的时候,就可以运行这个关卡对应的代码。如果从蓝图的角度看,UE有一个叫做“关卡蓝图”的东西:
在这里插入图片描述

  打开了之后,会看见里面默认有Event BeginPlay和EventTick两个节点,然后我们就可以在里面编写逻辑。
在这里插入图片描述

  UE的每一个Level,都会有一个对应的关卡蓝图。

3、 GameMode

  GameMode的概念和关卡蓝图有点类似,它也是在游戏启动的时候会自动运行的。不过有个区别是,GameMode可以设置一个默认的,如果关卡本身不指定单独的GameMode,那么每个关卡在载入的时候,都会运行默认的同一个GameMode代码,然后每一个Level也可以单独指定属于自己的一个特殊的GameMode。
在这里插入图片描述

  这样的操作,就有点类似于在Unity引擎的关卡里面挂一个空物体再挂一个MonoBehaviour的情况,反正这个关卡载入成功后,就会自动调用这个指定的GameMode里面的代码,并且运行生命周期。
  所以,关卡蓝图和GameMode是可以同时存在的,但两者做的事情有点类似。

二、 Actor和GameModeBase

1、 Actor

  如果我们创建一个蓝图类,会看到可以让我们选择父级:
在这里插入图片描述
在这里插入图片描述

  然后最基础的父类,就是Actor,这个东西,对比Unity引擎来说,其实就是类似于GameObject,它是一个可以放置在场景里面的对象,包含着一些基础的Transform属性,还有生命周期。
  双击打开Actor的蓝图,会看到里面有EVent BeginPlay、Event ActorBeginOverlap和Event Tick三个默认的节点。这和之前的关卡蓝图有点类似,其实都是代表着这个Actor的生命周期,比如BeginPlay就是在Actor被载入的时候会运行一次。
在这里插入图片描述

  实际上创建其他蓝图类型,他们的基类都是Actor。

2、 GameModeBase

  再来创建一个游戏模式基础的蓝图看看:
在这里插入图片描述

  这里我把这个游戏模式的蓝图命名为”GameModeBaseBP”:
在这里插入图片描述

  可以发现,在之前指定游戏模式的地方,会同时出现之前用C++写的MyGameModeBase,和用蓝图创建的GameModeBaseBP。
在这里插入图片描述

  所以,这个GameModeBase,既可以用C++实现,又可以用蓝图实现。
  双击打开这个GameModeBaseBP蓝图,会看到和Actor是差不多的,也是有BeginPlay和Tick的生命周期。
在这里插入图片描述

  当然,Actor的生命周期不止这两个,还有其他,比如可以添加一个EndPlay的生命周期。
在这里插入图片描述
在这里插入图片描述

  又来对比一下Unity引擎,Unity引擎里面的生命周期,都是由MonoBehaviour而来的,所以继承MonoBehaviour的所有类都可以使用Awake、Start、Update、OnDestroy之类的生命周期。
那么UE这边,因为都是基础Actor的,所以Actor的生命周期,比如BeginPlay、Tick和EndPlay之类的,其他继承Actor的类都能使用,包括GameModeBase。

三、 生命周期说明

  如果用C++来编写GameModeBase,那么需要这样声明生命周期:
MyGameModeBase.h

#pragma once

#include "CoreMinimal.h"
#include "GameFramework/GameModeBase.h"
#include "MyGameModeBase.generated.h"

/**
 * 
 */
UCLASS()
class UECPPTEST_API AMyGameModeBase : public AGameModeBase
{
	GENERATED_BODY()
public:
	AMyGameModeBase();
public:
	virtual void BeginPlay();
	virtual void Tick(float DeltaTime);
	virtual void EndPlay(const EEndPlayReason::Type EndPlayReason);
};

MyGameModeBase.cpp

#include "MyGameModeBase.h"
AMyGameModeBase::AMyGameModeBase()
{
	PrimaryActorTick.bCanEverTick = true;
}

void AMyGameModeBase::BeginPlay()
{
	Super::BeginPlay();
	UE_LOG(LogTemp, Display, TEXT("On level Start"));
}

void AMyGameModeBase::Tick(float DeltaTime)
{
	Super::Tick(DeltaTime);
	UE_LOG(LogTemp, Display,TEXT("OnUpdate:%f"),DeltaTime);
}

void AMyGameModeBase::EndPlay(const EEndPlayReason::Type EndPlayReason)
{	
	Super::EndPlay(EndPlayReason);
	FString str = StaticEnum<EEndPlayReason::Type>()->GetNameStringByValue((int64)EndPlayReason);
	UE_LOG(LogTemp, Display, TEXT("End Play:%s"), *str);
}

说明:
BeginPlay
相当于Unity的Start,在Actor对象刚开始播放时调用
Tick
相当于Unity的Update,但默认是不会调用的,需要在构造函数的时候开启:

PrimaryActorTick.bCanEverTick = true;

EndPlay
相当于Unity的OnDestroy,在Actor对象被销毁的时候调用,其中EndPlayReason是销毁的原因。
对应的枚举EEndPlayReason::Type

enum Type : int
{
	/** When the Actor or Component is explicitly destroyed. */
	Destroyed,
	/** When the world is being unloaded for a level transition. */
	LevelTransition,
	/** When the world is being unloaded because PIE is ending. */
	EndPlayInEditor,
	/** When the level it is a member of is streamed out. */
	RemovedFromWorld,
	/** When the application is being exited. */
	Quit,
};

如果要打印这个枚举,可以:

FString str = StaticEnum<EEndPlayReason::Type>()->GetNameStringByValue((int64)EndPlayReason);
	UE_LOG(LogTemp, Display, TEXT("End Play:%s"), *str);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1707594.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

huggingface 笔记:聊天模型

1 构建聊天 聊天模型继续聊天。传递一个对话历史给它们&#xff0c;可以简短到一个用户消息&#xff0c;然后模型会通过添加其响应来继续对话一般来说&#xff0c;更大的聊天模型除了需要更多内存外&#xff0c;运行速度也会更慢首先&#xff0c;构建一个聊天&#xff1a; ch…

企业文件加密实现数据泄露防护

在数字化时代&#xff0c;数据成为企业最宝贵的资产之一。然而&#xff0c;数据泄露事件频发&#xff0c;给企业带来了巨大的经济损失和声誉风险。为了保护企业的核心利益&#xff0c;实现数据泄露防护&#xff0c;企业必须采取有效的文件加密措施。 一、数据泄露的严重性 数据…

基于STM32实现智能交通灯控制系统

目录 引言环境准备智能交通灯控制系统基础代码示例&#xff1a;实现智能交通灯控制系统 GPIO控制交通灯定时器配置与使用红外传感器检测车辆用户界面与显示应用场景&#xff1a;城市交通管理与自动化控制问题解决方案与优化收尾与总结 1. 引言 本教程将详细介绍如何在STM32嵌…

汽车大灯中擎耀智能控制器在车灯智能化配置下的创新与分析

随着科技的飞速发展&#xff0c;汽车工业也在不断地进行着革新。其中&#xff0c;车灯作为汽车的重要组成部分&#xff0c;其智能化配置已经成为汽车行业的一大趋势。这种趋势不仅为消费者带来了更加安全、便捷的驾驶体验&#xff0c;同时也为商家提供了丰富的商业机会。汽车工…

JS中运算符详解

一&#xff1a;赋值运算符 1 类型 、、-、*、/等 2 如何运行 &#xff0c;是将等号右边的数赋值给左边以为例&#xff0c;let num 5&#xff1b;num2等价于numnum2 二&#xff1a;一元运算符 1 自增运算符 什么是一元运算符 只需要一个操作数就可以运算的运算符 &#x…

开源数据库同步工具DBSyncer

前言&#xff1a; 这么实用的工具&#xff0c;竟然今天才发现&#xff0c;相见恨晚呀&#xff01;&#xff01;&#xff01;&#xff01; DBSyncer&#xff08;英[dbsɪŋkɜː]&#xff0c;美[dbsɪŋkɜː 简称dbs&#xff09;是一款开源的数据同步中间件&#xff0c;提供M…

解读vue3源码-1

提示&#xff1a;看到我 请让滚去学习 vue3渲染流程 文章目录 vue3渲染流程vue3的3个核心&#xff1a;1.响应式模块(Reactivity Module)--创建响应式数据2.编译模块(Compiler Module)--模版编译器将html转换为一个渲染函数3.渲染模块(Renderer Module) 渲染流程&#xff1a;1.首…

【御控工业物联网】 Java JSON结构转换、JSON结构重构、JSON结构互换(17):数组To对象——键值互换属性重组

文章目录 一、JSON结构转换是什么&#xff1f;二、核心构件之转换映射三、案例之《JSON数组 To JSON对象》四、代码实现五、在线转换工具六、技术资料 一、JSON结构转换是什么&#xff1f; JSON结构转换指的是将一个JSON对象或JSON数组按照一定规则进行重组、筛选、映射或转换…

2024第三届AIGC开发者大会圆桌论坛:AI Agent中国落地发展现状及多模态结合具身智能的发展展望

在2024年第三届AIGC开发者大会上&#xff0c;多位业内专家齐聚一堂&#xff0c;共同探讨了AI Agent在中国的落地发展现状以及多模态结合具身智能的发展前景。本次圆桌论坛的嘉宾包括&#xff1a; Fast JP作者于金龙Agent创始人莫西莫必胜作者秦瑞January Agent创始人李晨 多模…

JavaEE:Servlet创建和使用及生命周期介绍

目录 ▐ Servlet概述 ▐ Servlet的创建和使用 ▐ Servlet中方法介绍 ▐ Servlet的生命周期 ▐ Servlet概述 • Servlet是Server Applet的简称&#xff0c;意思是 用Java编写的服务器端的程序&#xff0c;Servlet被部署在服务器中&#xff0c;而服务器负责管理并调用Servle…

【第5章】SpringBoot整合Druid

文章目录 前言一、启动器二、配置1.JDBC 配置2.连接池配置3. 监控配置 三、配置多数据源1. 添加配置2. 创建数据源 四、配置 Filter1. 配置Filter2. 可配置的Filter 五、获取 Druid 的监控数据六、案例1. 问题2. 引入库3. 配置4. 配置类5. 测试类6. 测试结果 七、案例 ( 推荐 )…

vivo X100 Ultra自称销售额破5亿,真实销量成谜?

文/张诗雨 5月28日9点&#xff0c;vivo 正式启动了其旗舰新机vivo X100 Ultra的全渠道销售工作。这款新机&#xff0c;早在5月13日就已正式亮相&#xff0c;并推出了三种存储容量的版本&#xff0c;分别是12GB256GB、16GB512GB以及16GB1TB&#xff0c;而相应的售价也不低&…

短道速滑短视频:四川京之华锦信息技术公司

短道速滑短视频&#xff1a;冰雪激情的视觉盛宴 随着冬奥会的热度不断攀升&#xff0c;短道速滑作为其中一项紧张刺激、充满观赏性的运动&#xff0c;受到了越来越多人的关注。而在社交媒体和短视频平台的助力下&#xff0c;短道速滑短视频成为了人们了解、欣赏这项运动的新窗…

vxe-form-design 表单设计器的使用

vxe-form-design 在 vue3 中表单设计器的使用 查看官网 https://vxeui.com 安装 npm install vxe-pc-ui // ... import VxeUI from vxe-pc-ui import vxe-pc-ui/lib/style.css // ...// ... createApp(App).use(VxeUI).mount(#app) // ...使用 github vxe-form-design 用…

Linux软硬链接详解

软链接&#xff1a; ln -s file1 file2//file1为目标文件&#xff0c;file2为软链接文件 演示&#xff1a; 从上图可以得出&#xff1a; 软链接本质不是同一个文件&#xff0c;因为inode不同。 作用&#xff1a; 软连接就像是Windows里的快捷方式&#xff0c;里面存放的是目标…

Llama模型家族训练奖励模型Reward Model技术及代码实战(二)从用户反馈构建比较数据集

LlaMA 3 系列博客 基于 LlaMA 3 LangGraph 在windows本地部署大模型 &#xff08;一&#xff09; 基于 LlaMA 3 LangGraph 在windows本地部署大模型 &#xff08;二&#xff09; 基于 LlaMA 3 LangGraph 在windows本地部署大模型 &#xff08;三&#xff09; 基于 LlaMA…

DES加密算法笔记

【DES加密算法&#xff5c;密码学&#xff5c;信息安全】https://www.bilibili.com/video/BV1KQ4y127AT?vd_source7ad69e0c2be65c96d9584e19b0202113 根据此视频学习 DES是对称密码中的分组加密算法 (分组加密对应流加密算法) 流加密算法就是一个字节一个字节加密 分组加…

Mybatis枚举类型转换

Mybatis枚举类型转换 类型转换器源码分析 在Mybatis的TypeHandlerRegistry中&#xff0c;添加了常用的类转换器&#xff0c;其中默认的枚举类型转换器是EnumTypeHandler。 public final class TypeHandlerRegistry {....public TypeHandlerRegistry(Configuration configura…

第 8 章 机器人平台设计之传感器(自学二刷笔记)

重要参考&#xff1a; 课程链接:https://www.bilibili.com/video/BV1Ci4y1L7ZZ 讲义链接:Introduction Autolabor-ROS机器人入门课程《ROS理论与实践》零基础教程 8.6.1 传感器_激光雷达简介 激光雷达是现今机器人尤其是无人车领域及最重要、最关键也是最常见的传感器之一&…

opencv c++编程基础

1、图片的本质 图像在 OpenCV 中的本质 在 OpenCV 中&#xff0c;图像被表示为一个多维数组&#xff0c;其中每个元素对应于图像中的单个像素。图像的维度取决于其通道数和像素数。 **通道数&#xff1a;**图像可以有多个通道&#xff0c;每个通道存储图像的不同信息。例如&…