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

  大家好,我是阿赵。
  之前在介绍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);

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

瑞_Windows环境下使用bat重启jar包等服务

文章目录 命令示例重启ray-project.jar重启redis服务 &#x1f64a; 前言&#xff1a;经验分享——Windows环境下使用.bat批处理文件重启 jar 包等服务。在学习或者工作日常中&#xff0c;有时候会需要在 Windows 系统环境下去启动 jar 包或其它服务&#xff0c;此时如果使用关…

RSC英国皇家化学学会文献查找下载

英国皇家化学学会(Royal Society of Chemistry&#xff0c;简称RSC)是以促进全球化学领域研究发展与传播为宗旨的国际权威学术机构&#xff0c;是化学信息的一个重要宣传机关和出版商。RSC出版的期刊是化学领域的核心期刊&#xff0c;大部分被SCI和MEDLINE收录&#xff0c;如An…

详解 Scala 的变量、标识符、数据类型

一、注释 Scala 注释与 Java 一致 // 单行注释/** 多行注释*//*** 文档注释*/二、变量与常量 1. 语法 // 变量&#xff0c;类型可以省略 var varName:varClass value // 常量&#xff0c;类型可以省略 val valName:valClass value2. 案例 // 使用 var/val 才会在类中声明属…

系统架构设计师【第1章】: 绪论 (核心总结)

文章目录 1.1 系统架构概述1.1.1 系统架构的定义及发展历程1.1.2 软件架构的常用分类及建模方法1.1.3 软件架构的应用场景1.1.4 软件架构的发展未来 1.2 系统架构设计师概述1.2.1 架构设计师的定义、职责和任务1.2.2 架构设计师应具备的专业素质1.2.3 架构设计师的知识…

自适应星空背景个人导航单页(附带源码)

自适应星空背景个人导航单页 效果图部分源码领取源码下期更新预报 效果图 部分源码 function Star(id, x, y) {this.id id;this.x x;this.y y;this.r Math.floor(Math.random() * 2) 1;var alpha (Math.floor(Math.random() * 10) 1) / 10 / 2;this.color "rgba(…

pip install pytorch-quantization error

一 报错信息 最近安装pytorch-quantization报错&#xff0c;安装失败报错信息如下&#xff1a; Looking in indexes: https://pypi.org/simple, https://pypi.ngc.nvidia.com Collecting pytorch-quantizationDownloading pytorch-quantization-2.2.1.tar.gz (6.8 kB)Prepari…

Kali : 安装Google Chrome 浏览器和ChromeDriver

一、安装Google Chrome 浏览器 1、下载Google Chrome 执行如下命令&#xff0c;下载最新版Chrome wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb 执行下载截图 2、安装Chrome 使用dpkg安装下载的deb包 sudo dpkg -i google-chrome-st…

美业系统SaaS收银系统源码-顾客在系统付款了但系统未显示怎么办?美业系统实测

美业SaaS系统 连锁多门店美业收银系统源码 多门店管理 / 会员管理 / 预约管理 / 排班管理 / 商品管理 / 活动促销 PC管理后台、手机APP、iPad APP、微信小程序 1. 提供门店名称、付款凭证和会员手机号 2. 到订单明细查询&#xff0c; 按门店名称和会员手机号查询看是否有相…

IDEA社区版创建并运行maven管理的web项目的基本流程

一、前言 注意&#xff0c;这是社区版&#xff0c;旗舰版可以绕路。 二、过程 1、下载安装社区版 2、安装jdk&#xff0c;tomcat&#xff0c;maven 3、创建并启动项目 注意选择的骨架是maven-archetype-webapp&#xff0c;然后next&#xff0c;设置项目名&#xff0c;存放…

家政预约小程序07服务分类展示

目录 1 创建服务分类页面2 侧边栏选项卡配置3 配置数据列表4 从首页跳转到分类页总结 上一篇我们开发了首页的服务展示功能&#xff0c;本篇我们讲解一下服务分类功能的开发。在小程序中通常在底部导航栏有一个菜单可以展示所有服务&#xff0c;侧边选项卡可以展示分类信息&…

Android 11 触摸小圆点显示流程

在开发者选项中&#xff0c;打开 “显示点按操作反馈” 开关&#xff0c;当我们在触摸屏幕时&#xff0c;会显示一个小圆点&#xff0c;来分析下小圆点的显示流程。 操作这个开关时&#xff0c;其实就是操作Settings数据库中的 SHOW_TOUCHES //packages\apps\Settings\src\com…

数据大屏vue3+ts+axios+MockJS+dataV+echarts

一、官网/文档 vue3&#xff1a;https://cn.vuejs.org/api/TypeScript&#xff1a;https://www.tslang.cn/docs/handbook/basic-types.htmlaxios&#xff1a;http://www.axios-js.com/zh-cn/docs/MockJS&#xff1a;http://mockjs.com/dataV&#xff1a;http://datav.jiamingh…

马斯克xAI融资60亿美元,宣布打造世界第一超算中心,10万张H100GPU

昨天&#xff0c;埃隆马斯克的xAI初创公司宣布获得60亿美元的巨额融资&#xff0c;主要用于打造一台巨大的超级计算机&#xff0c;马斯克称之为“超级计算工厂”。 从创立OpenAI到如今的xAI&#xff0c;技术和算力的发展历经了几个时代&#xff0c;但似乎马斯克的吸金能力一直…

CISCN --EzHeap

当时有点着急了&#xff0c;这题没写出来&#xff0c;结束后在ctfshow上做了一下。 使用的方法是environ泄露栈地址&#xff0c;然后在栈上构造orw的rop链。 以下是过程&#xff1a; 只能orw。 堆体开沙盒模式会在heap和bin一开始构造很多垃圾堆。所以分配和free的时候要注意…

nuxt3+Element Plus项目搭建过程记录

背景 本文只记录项目搭建过程中遇到的一些问题和关键点&#xff0c;nuxt框架的说明和API请参照官网学习 官网&#xff1a;https://nuxt.com/docs/getting-started/introduction 1. 初始化项目 指令如下: npx nuxilatest init <project-name>我在安装过程中出现报错&a…

玻璃加工生产线液压比例控制器

玻璃加工生产线广泛应用于自动化中空玻璃的生产、清洗、磨边、上片、除膜、打胶等各个环节&#xff0c;体现了高度的专业化和自动化水平。在玻璃制造过程中&#xff0c;液压升降机用于玻璃板材的升降和定位&#xff0c;确保玻璃在加工过程中的稳定性。液压系统提供的强大而平稳…

2024-05-28 服务器开发-不同vs版本的std::string的访问出错问题-记录

摘要: 有一个dll库是使用vs2010编译的, 使用这个dll动态库的工程是vs2019. 这个dll动态库返回一个结构体&#xff0c;其中有个成员使用了std::string。但是遇到了std::string的成员显示被赋值为NULL的情况。 本文对进行分析, 重点在于追踪问题的思路。 问题描述: dll使用vs20…

盐城市大数据集团携手百望云 以MaaS推进数字经济跃迁

随着ChatGPT的爆火&#xff0c;大模型、人工智能、大数据等技术&#xff0c;被快速推向市场最前沿。如何通过创新技术提升企业的数字化能力&#xff0c;助力数据要素资产沉淀&#xff0c;推动企业及所在行业、区域实现数智化转型&#xff0c;是大家关注的核心问题。 “携手共建…

电商API接口助力直播带货选品||助力电商平台搭建选品

如今&#xff0c;直播带货如火如荼。直播带货的核心是卖货、品牌盈利&#xff0c;那想要带货效果更好&#xff0c;选品及定价是最关键的环节。 事实上&#xff0c;品牌企业可以直接使用API接口工具来辅助自身选品及定价&#xff0c;这主要是因为比价工具在直播带货选品环节能起…

ChatGPT原创指令大全(持续更新)

随着ChatGPT在互联网上的使用越来越多&#xff0c;但很多人在使用ChatGPT的过程中会觉得得到的答案并不是很精准。究其原因其实是你给它的命令不够准确、不够到位。实际现在网上已经很多关于ChatGPT的网站&#xff0c;可以快速生成带有快捷键的ChatGPT指令。但是对于不熟悉Chat…