- ???♂? 作者:海碼007
- ?? 專(zhuān)欄:UE虛幻引擎專(zhuān)欄
- ?? 標(biāo)題:UE4 中可全局獲取的變量(例如游戲?qū)嵗⑼婕铱刂破?、游戲模式等?詳解
- ?? 寄語(yǔ):加油,一次專(zhuān)注一件事!
- ?? 最后:文章作者技術(shù)和水平有限,如果文中出現(xiàn)錯(cuò)誤,希望大家能指正,同時(shí)有問(wèn)題的話,歡迎大家留言討論。
0 引言
在游戲開(kāi)發(fā)過(guò)程中,有一些變量經(jīng)常需要被別的藍(lán)圖調(diào)用,但是這個(gè)變量又不是全局變量。所以使用前需要通過(guò)Get Actor Of Class(獲取類(lèi)的actor)的方式獲取對(duì)象的引用。但是假如我們將經(jīng)常需要用到的變量存儲(chǔ)在全局對(duì)象當(dāng)中,下次別人要調(diào)用就直接通過(guò)這個(gè)全局對(duì)象來(lái)訪問(wèn)這個(gè)變量。
1 全局對(duì)象(全局變量)
??對(duì)象其實(shí)也是一種變量,所以全局對(duì)象也可以叫做全局變量??
在UE4中,有一些全局可獲取的變量,可以方便地訪問(wèn)和管理游戲的各個(gè)方面。
- GameInstance 游戲?qū)嵗?/strong>
- GameViewportClient 游戲視口客戶(hù)端
- UWorld 游戲世界
- GameModeBase 游戲模式
- PlayerController 玩家控制器
- Actor 演員
通過(guò)這些全局變量,開(kāi)發(fā)者可以方便地訪問(wèn)和管理游戲的不同方面,從而實(shí)現(xiàn)更靈活和高效的游戲邏輯和交互操作。
拓展:在UE4切換關(guān)卡時(shí),下面這些全局變量不會(huì)被釋放:
- GameInstance 游戲?qū)嵗?/strong>:游戲?qū)嵗械臄?shù)據(jù)將在切換關(guān)卡時(shí)保留,以便在下一個(gè)關(guān)卡中繼續(xù)使用。
- PlayerController 玩家控制器:玩家控制器是負(fù)責(zé)玩家輸入和控制的對(duì)象,它們?cè)谇袚Q關(guān)卡時(shí)通常會(huì)保持不變。
- GameModeBase 游戲模式:游戲模式定義了游戲的規(guī)則和邏輯,它們?cè)谇袚Q關(guān)卡時(shí)通常會(huì)保持不變。
- 主角色(APawn、ACharacter):游戲中主角的演員(Actor)通常會(huì)在切換關(guān)卡時(shí)保持不變。
- 關(guān)卡關(guān)聯(lián)的演員(Actor):如果某個(gè)actor在關(guān)卡編輯器中被直接放置在關(guān)卡中,那么在切換關(guān)卡時(shí)它們通常會(huì)保持不變。下圖所示,每個(gè)actor都有自己所屬的關(guān)卡
![]()
需要注意的是,不會(huì)被釋放的變量只是在切換關(guān)卡時(shí)會(huì)保持不變,但在游戲結(jié)束或重新加載游戲時(shí)可能會(huì)被重置或釋放。此外,其他不直接與特定關(guān)卡和角色關(guān)聯(lián)的全局變量也可以在切換關(guān)卡時(shí)保持不變,如全局的游戲配置、游戲狀態(tài)等。
1.1 游戲?qū)嵗?GameInstance
1.1.1 介紹
UGameInstance:游戲?qū)嵗?,它?fù)責(zé)保存和共享游戲的全局?jǐn)?shù)據(jù)和狀態(tài)。可以在項(xiàng)目中創(chuàng)建自定義的UGameInstance子類(lèi),通過(guò)GetGameInstance函數(shù)獲取當(dāng)前的游戲?qū)嵗?,并使用其中的變量?lái)存儲(chǔ)和訪問(wèn)全局?jǐn)?shù)據(jù)。
GameInstance是UE4中的全局類(lèi),只有一個(gè)實(shí)例(就像是單例設(shè)計(jì)模式,只有一個(gè)對(duì)象)
GameInstance常用的函數(shù)與用法
Event Init(事件初始)與 Event Shutdown(事件關(guān)閉),引擎初始化與關(guān)閉時(shí)執(zhí)行的邏輯。
為游戲保存全局?jǐn)?shù)據(jù):比如上一個(gè)關(guān)卡的信息需要在下一個(gè)關(guān)卡使用時(shí);只是臨時(shí)數(shù)據(jù),游戲結(jié)束則消失;則可以將這些臨時(shí)數(shù)據(jù)保存在GameInstance中。(假如需要持久保存數(shù)據(jù)需要用SaveGame,也就是將數(shù)據(jù)存儲(chǔ)到磁盤(pán)中)
1.1.2 使用 GameInstance
- 首先新建藍(lán)圖類(lèi)繼承 GameInstance 基類(lèi)
![]()
- 在項(xiàng)目設(shè)置中配置游戲?qū)嵗?lèi)為我們剛才新建的游戲?qū)嵗?lèi)即可。(不配置的話游戲運(yùn)行還是使用的默認(rèn)的類(lèi))
![]()
- 在其他藍(lán)圖類(lèi)中獲取游戲?qū)嵗龑?duì)象
![]()
深入思考:通過(guò)獲取游戲?qū)嵗玫降钠鋵?shí)是父類(lèi)的指針(應(yīng)該是父類(lèi)指針指向子類(lèi)對(duì)象),但是使用父類(lèi)指針是訪問(wèn)不了子類(lèi)中特有的函數(shù)的,所以就需要進(jìn)行類(lèi)型轉(zhuǎn)換(UE的類(lèi)型轉(zhuǎn)換在C++中對(duì)應(yīng)的就是static_cast、dynamic_cast等類(lèi)型轉(zhuǎn)換函數(shù))。
這是一種抽象編程的思想,假如【獲取游戲?qū)嵗亢瘮?shù)獲取的不是父類(lèi)指針,而是直接獲取對(duì)應(yīng)的子類(lèi)指針,而且我們也不知道未來(lái)會(huì)有多少子類(lèi)被定義。不能新定義一個(gè)子類(lèi),我們就去修改【獲取游戲?qū)嵗亢瘮?shù)的源碼,很顯然這種程序設(shè)計(jì)思想太垃圾了。
1.2 玩家控制器 PlayerController
玩家控制器 和 GameInstance 使用方法很類(lèi)似
它也可以通過(guò)【獲取玩家控制器】函數(shù)獲取父類(lèi)指針,然后類(lèi)型轉(zhuǎn)換為子類(lèi)類(lèi)型之后就可以使用功能。
使用步驟:
- 新建一個(gè)子類(lèi)派生于 PlayerController
![]()
- 設(shè)置【項(xiàng)目設(shè)置中】選擇新建的玩家控制器類(lèi)(首先得新建一個(gè)游戲模式的子類(lèi),才能選擇玩家控制器類(lèi))
![]()
- 使用
![]()
1.3 游戲世界類(lèi) UWorld
在UE4中,UWorld是一個(gè)重要的類(lèi),代表了游戲世界的實(shí)例。它是一個(gè)容器,用于存儲(chǔ)和管理游戲中所有的Actors(角色)和Objects(對(duì)象),并負(fù)責(zé)協(xié)調(diào)它們之間的交互和邏輯。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-739861.html
這部分內(nèi)容了解的還不多,挖個(gè)坑,等學(xué)習(xí)熟練之后再將這部分內(nèi)容補(bǔ)全。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-739861.html
到了這里,關(guān)于UE4 中可全局獲取的變量(例如游戲?qū)嵗?、玩家控制器等?詳解的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!