阿趙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);

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/18201.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/18201.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/18201.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

HashMap在Go與Java的底層實現與區別

在Java中 在Java中hash表的底層數據結構與擴容等已經是面試集合類問題中幾乎必問的點了。網上有對源碼的解析已經非常詳細了我們這里還是說說其底層實現。 基礎架構 public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable,…

簡單幾步構建設企業流媒體服務器

簡單幾步構建設企業流媒體服務器 在企業應用中&#xff0c;涉及到視頻服務時&#xff0c;直接的應用要求即是視頻的實時查看&#xff01;如果使用各大平臺的流媒體服務&#xff0c;對于針對設備的視頻服務&#xff0c;如IPC的各種應用場景&#xff0c;在這個卷的時代&#xff…

Cesium For Unity 在Unity中無法下載的問題

Unity 下載失敗&#xff0c;提供百度網盤“com.cesium.unity-1.10.0.tgz”下載鏈接 鏈接&#xff1a;https://pan.baidu.com/s/1PybXQ8EvkRofOKD6rSN66g?pwd1234 提取碼&#xff1a;1234 導入方法&#xff1a; 1.打開PackageManager;Window-PackageManager 2.在PackageMan…

從機械塵埃到智能星河:探索從工業心臟到AI大腦的世紀跨越(一點個人感想)...

全文預計1400字左右&#xff0c;預計閱讀需要8分鐘。 近期&#xff0c;人工智能領域呈現出前所未有的活躍景象&#xff0c;各類創新成果如雨后春筍般涌現&#xff0c;不僅推動了科技的邊界&#xff0c;也為全球經濟注入了新的活力。 這不&#xff0c;最近報道16家國內外企業在A…

優思學院:質量工程師必備技能清單,你具備了嗎?

想要了解質量工程師需要具備哪些技能和知識&#xff0c;最直接且實際的方法就是分析招聘廣告中的關鍵詞&#xff0c;這比道聽途說更加有效。為此&#xff0c;優思學院搜集了大量關于質量工程師職位的招聘信息&#xff0c;并為大家進行詳細分析。我們通常選擇中高級職位進行分析…

嵌入式C語言指針詳細解說

各位伙伴大家好,在實現操作系統的控制的時候,經常需要使用到指針,利用這次詳細分析一下指針的用法。 C語言指針真正精髓的地方在于指針可以進行加減法,這一點極大的提升了程序對指針使用的靈活性,同時也帶來了不小的學習負擔。正是因為C語言指針可運算,才奠定了如今C語言…

「Element-UI表頭添加帶Icon的提示信息」

一、封裝全局組件 &#x1f353; 注意&#xff1a;可以直接復制該文件 <!-- // 寫一個PromptMessage的組件&#xff0c;并全局注冊 --> <template><div class"tooltip"><el-tooltip effect"dark" placement"right">&l…

MySQL select for update 加鎖

背景 當多人操作同一個客戶下賬號的時候&#xff0c;希望順序執行&#xff0c;某個時刻只有一個人在操作&#xff1b;當然可以通過引入redis這種中間件實現&#xff0c;但考慮到并發不會很多&#xff0c;所以不想再引入別的中間件。 表結構 create table jiankunking_accoun…

基于Python flask的豆瓣電影數據分析可視化系統,功能多,LSTM算法+注意力機制實現情感分析,準確率高達85%

研究背景 隨著數字化時代的到來&#xff0c;電影產業正迎來新的發展機遇和挑戰。基于Python Flask的豆瓣電影數據分析可視化系統的研究背景凸顯了對電影數據的深度分析和情感挖掘的需求。該系統功能豐富&#xff0c;不僅實現了多樣化的數據分析功能&#xff0c;還結合了LSTM算…

2024/5/23 學習雜記

目錄 位運算與邏輯運算讀程序練習 在switchcase 語句中能否使用continue關鍵字&#xff1f;為什么&#xff1f; 為什么盡量不使用goto語句? void i與i i和i 哪個效率更高&#xff1f; 良好的條件比較語句風格 memcpy memset 位運算與邏輯運算讀程序練習 int x 3, y…

如何解決Redis緩存擊穿?

Redis緩存擊穿問題,也稱作熱點Key問題,通常發生在高并發場景下,當一個被高并發訪問且緩存重建業務較復雜的key突然失效時,大量請求會同時訪問數據庫,導致數據庫壓力瞬間增大。以下是解決Redis緩存擊穿問題的幾種方案: 使用鎖(互斥鎖): 原理:當緩存失效時,不是所有線…

CTF| 格式化字符串漏洞

格式化字符串漏洞是PWN題常見的考察點&#xff0c;僅次于棧溢出漏洞。漏洞原因&#xff1a;程序使用了格式化字符串作為參數&#xff0c;并且格式化字符串為用戶可控。其中觸發格式化字符串漏洞函數主要是printf、sprintf、fprintf、prin等C庫中print家族的函數 0x01 格式化字符…

雙非二本找工作前的準備day28

學習目標&#xff1a; 每天復習代碼隨想錄上的題目2-3道算法&#xff08;時間充足可以繼續&#xff09; 今日碎碎念&#xff1a; 1&#xff09;進入貪心與dp專題&#xff0c;過完準備二刷&#xff0c;以及刷劍指offer。 2&#xff09;這兩天沒更新是休息一下&#xff0c;然后…

如何深入理解、應用及擴展 Twemproxy?no.15

Twemproxy 架構及應用 Twemproxy 是 Twitter 的一個開源架構&#xff0c;它是一個分片資源訪問的代理組件。如下圖所示&#xff0c;它可以封裝資源池的分布及 hash 規則&#xff0c;解決后端部分節點異常后的探測和重連問題&#xff0c;讓 client 訪問盡可能簡單&#xff0c;同…

C語言之宏詳解(超級詳細!)

目錄 一、用宏前須知-#define相關知識 大致結構&#xff1a; 對預定義符號的補充&#xff1a; 二、用#define定義宏 什么是宏&#xff1f; #define的替換規則&#xff1a; 三、常用的宏定義 1、宏定義常量 2、定義一個宏語句 3、宏定義函數 宏與函數的對比&#xff1a; …

29【PS 作圖】宮燈 夜景轉換

夜景轉化 1 原圖 2 選中要變換的圖層,然后點擊“顏色查找” 再3DLUT文件中,選擇moonlight.3DL,可以快速把圖層變成偏夜景的顏色 結果如下: 3 選擇“曲線” 把曲線 右邊往上調【亮的更亮】,左邊往下調【暗的更暗】 4 添加燈光 新建一個圖層

前端面試題大合集8----性能優化篇

一、哪些方法可以提升網站前端性能 1、Http請求優化 主要分為減少Http請求次數&#xff0c;減小請求數據量和緩存三方面。 減少Http請求次數&#xff0c;可以通過以下方法實現&#xff1a; 合并js、css文件&#xff1b;使用css-spirites技術合并圖片&#xff1b;壓縮圖片大…

HTML+CSS+JS簡易計算器

HTMLCSSJS簡易計算器 index.html <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>簡易計算器</t…

AAA實驗配置

一、實驗目的 掌握AAA本地認證的配置方法 掌握AAA本地授權的配置方法 掌握AAA維護的方法 1.搭建實驗拓撲圖 2.完成基礎配置&#xff1a; 3.使用ping命令測試兩臺設備的連通性&#xff1a; 二、配置AAA 1.打開R1&#xff1a;配置AAA方案 這兩個方框內的可以改名&#xff0c…

百度頁面奔跑的白熊html、css

一、相關知識-動畫 1.基本使用&#xff1a;先定義再調用 2. 調用動畫 用keyframes定義動畫&#xff08;類似定義類選擇器&#xff09; keyframes動畫名稱{ 0%{ width:100px&#xff1b; } 100%{ width:200px; } } 使用動畫 div { width:200px; height:200px; background-…