游戲框架筆記

游戲的數據有哪些類型

無非是只讀數據(各種道具配表里的數據)和可讀可寫數據(玩家屬性、擁有的物品)。

游戲框架需要哪些管理器

用戶數據管理器

負責找到數據持久化文件,從中讀取指定用戶的數據,包括玩家的設置數據(音量等)、擁有的物品(金幣、人物、道具)。

不需要依附游戲對象,一般是不繼承MonoBehavior的單例。

資源配置管理器

負責找到配表文件,根據外界要求的資源種類、ID返回資源的詳細信息(游戲內名字、圖標、預制體,其他信息如價格)。

資源加載管理器

負責封裝加載資源的方法(Resources和AB包),以便快速切換。主要用于資源配置信息管理器加載配表文件,和加載UI面板預制體。

和資源配置信息管理器可以合成一個嗎?不合適,因為還要加載UI預制體。

這個管理器就是提供加載資源的方法,并能方便在Resources和AB包加載之間切換。

場景管理器

提供異步加載場景的方法。顯示加載界面、更新進度條的代碼可以放在里面。

因為要用協程,且全局存在,應該是DontDestroyOnLoad的繼承MonoBehavior的類。

UI管理器

提供加載面板的方法,包括從Resources和AB包加載,包括全屏面板和部分面板。為此需要面板預制體的路徑和資源名,需要一個方法知道當前哪些面板在顯示,可以是查看一個面板類的單例是否存在,也可以用一個字典存儲顯示的面板。

聲音管理器

使玩家可在任意場景的設置面板改變音樂和音效音量。游戲所有播放聲音都要使用它封裝的函數。它無需儲存用戶設置的音量,因為那屬于用戶數據,由用戶數據管理器存儲。

看想不想用拖賦值,想就用DontDestroyOnLoad的繼承MonoBehavior的類。

關卡場景管理模塊

以上是游戲全局需要的管理器,在關卡場景有一些所有關卡都相同的管理模塊:輸入模塊、相機模塊、UI模塊(HUD、對話面板、交互選項面板、任務面板)、關卡管理器、緩存池。

這些模塊一般打成一個預制體,新建關卡時直接拖入。(虛幻項目直接就有一套這些)

緩存池

在射擊游戲里一般用來存彈殼、彈頭、擊中效果。只在關卡場景需要,所以用繼承MonoBehavior的單例,可以和游戲管理器、輸入模塊等打進同一個預制體。

public enum BufferType{impact,bullet, rifleShell,handgunShell,impactBlood}
public class BufferPoolBase : MonoSingleton<BufferPoolBase>
{public const float impactLifeTime=1;Dictionary<BufferType,Transform> bufferDict=new Dictionary<BufferType,Transform>();//可能的情況包括沒緩沖池、有緩沖池沒物體(一般不會有,但理論上可能)、有緩沖池有物體public GameObject Depool(GameObject prefab,BufferType bufferType,Vector3 position){GameObject instance;if(bufferDict.ContainsKey(bufferType)){//緩沖池已建立if(bufferDict[bufferType].childCount>0){//緩沖池里有物體instance=bufferDict[bufferType].GetChild(0).gameObject;//取出instance.transform.SetParent(null);//解綁instance.transform.position = position;instance.SetActive(true);//激活}else{//有緩沖池沒物體(曾經放入過物體,又拿出了)instance=Instantiate(prefab,position,Quaternion.identity);}}else{//沒有緩沖池Transform bufferTransform=new GameObject(bufferType.ToString()).transform;bufferTransform.parent=transform;bufferDict.Add(bufferType, bufferTransform);instance=Instantiate(prefab,position,Quaternion.identity);}return instance;}public void Enpool(GameObject instance,BufferType bufferType){if(!bufferDict.ContainsKey(bufferType)){Transform bufferTransform=new GameObject(bufferType.ToString()).transform;bufferDict.Add(bufferType, bufferTransform);}instance.transform.SetParent(bufferDict[bufferType]);instance.SetActive(false);}public IEnumerator EnpoolLater(GameObject instance,BufferType bufferType,float delay){yield return new WaitForSeconds(delay);Enpool(instance,bufferType);}

事件中心

我們知道事件中心是用于一個事件引發很多操作的,它比直接調用避免了蜘蛛網一樣的耦合,但是又比直接調用麻煩一點。那么問題是,任何一個類操作引起另一個類的操作都要用事件中心嗎?那樣很明顯事件中心會有大量事件。應該設置一個操作引起其他類操作個數的閾值,達到閾值的使用事件中心。

輸入模塊、玩家人物和人物

玩家人物和NPC人物有一些共性,玩家人物還有一些個性:更新UI、接受輸入控制。通常會把玩家人物作為人物的子類,重寫一些方法。問題是任何一個類操作引起另一個類操作都要用事件中嗎?

是否只有一個操作引起的操作達到一個數量時才值得用事件中心?

輸入模塊和玩家人物要寫在一個腳本嗎?

如果用了新的Input System,我們知道給幾十個按鍵配回調很麻煩,會想把PlayerInput和處理回調的腳本放在一個預制體里,如果把PlayerInput和玩家人物打進預制體,那么不同關卡用不同人物時又要換人物的骨架和模型,人物身上綁的物品掛載點、約束也要重新綁。會想到寫一個輸入回調處理腳本MyInputHandler和PlayerInput放在一起,MyInputHandler指向玩家人物。也就是輸入模塊和玩家人物分離。

輸入腳本和人物腳本的代碼分布

人物的各種行為會封裝成方法Move()、Turn()、Run()、Jump()。這些方法是在

  1. 人物腳本Update()
  2. 輸入腳本Update()
  3. 輸入腳本處理輸入的方法

執行?

放在輸入腳本Update()就等于輸入回調先寫入輸入腳本字段,再傳給人物腳本行為方法的輸入參數。

放在人物腳本Update就等于先寫入人物腳本字段再讓行為方法讀取。

放在輸入腳本的輸入回調方法就是把輸入變量傳給人物方法的輸入參數,只在輸入變量改變時執行。

為了減少字段,可以盡量用3,但有一些方法必須每幀執行,比如跑步可能被各種情況打斷(射擊、換彈、墜落)。跑步要執行,除了按下跑步,還要滿足幾個條件,這些條件有的靠狀態機的互斥就可以(跳躍、墜落),有的要另外判斷(主要是上半身層的)。執行跑步前把這些條件全部&&。

管理器分類

根據管理器的生命周期,可以分為整個游戲內存在的和場景內存在的。根據是否必須繼承MonoBehavior,可以分為繼承和不繼承。這兩個問題組合,其中不繼承MonoBehavior的一定整個游戲存在。這樣就把管理器分為3類:

  1. 不繼承MonoBehavior;
  2. 繼承MonoBehavior;
  3. 繼承MonoBehavior且DontDestroyOnLoad;

不繼承MonoBehavior

用戶數據管理器、資源配置管理器;

繼承MonoBehavior

各場景內的管理器。對于關卡場景,有輸入、相機、秩序管理、緩存池。

繼承MonoBehavior且DontDestroyOnLoad

通常是游戲全局存在且需要協程的管理器:場景管理器、AB包管理器。

還有必須和組件關聯的管理器,比如聲音管理器,必須記錄音樂聲源和UI音效聲源。

這些管理器可以打成一個預制體。

登錄注冊系統

多用戶數據系統

如果一個游戲要做登錄注冊界面,那么它就是一個多用戶游戲,意味著它有一個記錄用戶名和密碼的文件,而其他大部分數據(玩家擁有的人物、武器、物品、音量)都因用戶而異,需要在每個用戶注冊時建一個文件夾,把這些用戶數據文件都放在里面。

這樣UserDataManager在構建的時候就不能加載所有的數據,因為還沒登錄,不知道用戶名,也就不知道這些數據文件的路徑。所以需要一個UserManager,開始運行時構建,負責獲取上次登錄用戶、注冊新用戶、判斷登錄是否成功。加載登入用戶數據的DataManager在登錄成功后構建,它讀取數據的路徑依賴登入的用戶名。

場景管理

需要有一個《場景轉換圖》列出所有的場景和哪些場景。一般需要登錄場景、主界面場景、若干游戲場景。登錄場景和主界面場景應該分開,因為主界面場景可能從登錄場景或游戲場景進入。

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

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

相關文章

【C語言進階】指針面試題詳解(2)

上一期內容&#xff0c;大多數的解題思路寫在代碼中&#xff0c;沒有寫在正文中&#xff0c;這就導致系統判斷文章質量不高&#xff0c;沒有什么數據&#xff0c;這一期將思路寫在正文中。注意&#xff1a;運行環境是x86 1.題目1思路&#xff1a;&a是取到了整個數組的地址&…

一文讀懂現代卷積神經網絡—稠密連接網絡(DenseNet)

目錄 什么是 DenseNet&#xff1f; 稠密塊&#xff08;Dense Block&#xff09;詳解 一、稠密塊的核心思想 二、稠密塊的結構組成 1. 卷積單元&#xff08;的結構&#xff09; 2. 密集連接的具體方式 3. 關鍵參數&#xff1a;增長率&#xff08;Growth Rate, k&#xff0…

關于僵尸進程

深入理解僵尸進程&#xff1a;成因、危害與解決方案 進程終止的條件 我們先了解一下進程銷毀的條件&#xff1a; 調用了exit函數在main函數中執行了return語句 無論采用哪種方式&#xff0c;都會有一個返回值&#xff0c;這個返回值由操作系統傳遞給該進程的父進程。操作系統不…

深入解析進程、線程與協程:現代并發編程的三大支柱

深入解析進程、線程與協程&#xff1a;現代并發編程的三大支柱在計算資源日益豐富的時代&#xff0c;理解并發執行機制已成為每位開發者的必修課。本文將帶你深入探索操作系統中的三大并發模型&#xff1a;進程、線程與協程&#xff0c;揭開它們的神秘面紗。引言&#xff1a;并…

奇安信下一代防火墻SecGate3600

一、實驗拓撲&#xff1a;二、實驗目的&#xff08;1&#xff09;讓內網可以訪問外網。&#xff08;2&#xff09;讓外網能夠訪問dmz區域的web服務器。&#xff08;3&#xff09;測試防火墻的防毒功能&#xff0c;并進行檢測。三、實驗步驟&#xff08;1&#xff09;防火墻配置…

基于STM32的智能抽水灌溉系統設計(藍牙版)

????大家好&#xff0c;這里是5132單片機畢設設計項目分享&#xff0c;今天給大家分享的是基于《基于STM32的智能抽水灌溉系統設計》。 目錄 1、系統功能 2.1、硬件清單 2.2、功能介紹 2.3、控制模式 2、演示視頻和實物 3、系統設計框圖 4、軟件設計流程圖 5、原理…

CISSP知識點匯總- 通信與網絡安全

CISSP知識點匯總 域1---安全與風險管理域2---資產安全域3---安全工程域4---通信與網絡安全域5---訪問控制域6---安全評估與測試域7---安全運營域8---應用安全開發一、安全網絡架構和保護網絡組件 1、OSI 7層協議模型 應用層:SMTP、HTTP、SNMP 、TELNET、 FTP、SFTP、POP3、IM…

C++怎么將可變參數傳遞給第三方可變參數接口

文章目錄&#x1f527; 1. 使用 va_list 轉發&#xff08;兼容C/C的傳統方案&#xff09;?? 2. 模板參數包轉發&#xff08;C11 類型安全方案&#xff09;&#x1f9e9; 3. 替代方案&#xff1a;參數封裝與適配**方案A&#xff1a;使用 std::initializer_list (同類型參數)**…

服務端實現阿里云OSS直傳

介紹 阿里云上傳 OSS 有兩種方式&#xff0c;一種是普通上傳&#xff0c;一種是客戶端直傳。 普通上傳&#xff0c;就是需要先將文件上傳到服務端&#xff0c;然后調用接口將文件上傳到阿里云。 當然這種方案經常出現不合理的使用方式&#xff0c;即客戶端充當服務端的角色&…

on-policy和offpolicy算法

一句話總結On-policy&#xff08;同策略&#xff09;&#xff1a;邊學邊用&#xff0c;用當前策略生成的數據更新當前策略。例子&#xff1a;演員自己演完一場戲后&#xff0c;根據觀眾反饋改進演技。Off-policy&#xff08;異策略&#xff09;&#xff1a;學用分離&#xff0c…

CA-IS3082W 隔離485 收發器芯片可能存在硬件BUG

RT&#xff0c;這個RS485 隔離收發器芯片基本上不可用。本來要買CA-IS3082WX&#xff0c;不小心在某寶買到了沒有X 的CA-IS3082W。立創上說沒有X 的版本已經停產&#xff0c;連對應的數據手冊都找不到&#xff0c;全換成WX 了。 這類半雙工485 收發器芯片電路一般都直接把DE 和…

dockerfile 筆記

# 設置JAVA版本 FROM openjdk:20-ea-17-jdk MAINTAINER aaa # 指定存儲卷, 任何向/tmp寫入的信息都不會記錄到容器存儲層 VOLUME /tmp # 拷貝運行JAR包 ARG JAR_FILE COPY app.jar /app.jar RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime RUN echo "Asia/…

高德開放平臺攜手阿里云,面向開發者推出地圖服務產品MCP Server

高德開放平臺攜手阿里云&#xff0c;面向開發者推出地圖服務產品MCP Server&#xff0c;通過技術能力與生態資源的深度協同&#xff0c;助力開發者高效構建標準化地圖服務&#xff0c;加速智能化場景落地。 高德開放平臺攜手阿里云&#xff0c;面向開發者推出MCP Server技術融合…

【論文閱讀】AdaptThink: Reasoning Models Can Learn When to Think

AdaptThink: Reasoning Models Can Learn When to Think3 Motivation3.1 理論基礎3.2 NoThinking在簡單問題中的優勢3.3 動機總結4. AdaptThink4.1 約束優化目標數學建模基本定義原始優化問題懲罰項轉換歸一化處理策略梯度實現優勢函數定義PPO風格損失函數4.2 重要性采樣策略問…

Redis高可用集群一主從復制概述

一、環境概述在分布式集群系統中為了解決服務單點故障問題&#xff0c;通常會把數據復制出多個副本部署到不同的機器中&#xff0c;滿足故障恢復和負載均衡等需求。Redis也是如此&#xff0c;它為我們提供了復制功能&#xff0c;實現了相同數據的多個Redis副本。復制功能是高可…

Java 樹形結構、層級結構數據構建

目錄前言一、樹狀結構數據庫存儲二、工具類三、測試四、自定義樹節點返回類型&#xff08;只保留部分字段&#xff09;1. 新增 TreeNodeDTO 類2.修改TreeUtil 類3.測試4.輸出前言 有時候&#xff0c;開發過程中我們會遇到一些樹狀層級結構。 比如&#xff0c;公司部門組織架構…

求解線性規劃模型最優解

歸納編程學習的感悟&#xff0c; 記錄奮斗路上的點滴&#xff0c; 希望能幫到一樣刻苦的你&#xff01; 如有不足歡迎指正&#xff01; 共同學習交流&#xff01; &#x1f30e;歡迎各位→點贊 &#x1f44d; 收藏? 留言?&#x1f4dd; 既然選擇了遠方&#xff0c;當不負青春…

達夢國產數據庫安裝

打開ISO 、文件點擊運行接受選擇安裝路徑數據初始化 新數據庫要創建數據庫實例 選擇一般用途數據庫位置 選擇所以系統用戶&#xff0c;設置初始密碼創建示例庫可以選可以不選查找最近添加文件登錄

互斥鎖與同步鎖

1. 鎖的本質&#xff1a;解決并發問題的基石在多線程/多進程環境中&#xff0c;臨界區&#xff08;Critical Section&#xff09; 是訪問共享資源的代碼段。鎖的核心目標是確保互斥訪問——任意時刻僅有一個執行單元能進入臨界區。// 典型臨界區示例 pthread_mutex_lock(&m…

高密度PCB板生產廠商深度解析

在電子制造領域&#xff0c;高密度PCB&#xff08;印制電路板&#xff09;作為核心基礎元件&#xff0c;其技術精度與生產穩定性直接影響終端產品性能。本文精選五家具備核心技術優勢的國內廠商&#xff0c;通過實地調研與行業數據驗證&#xff0c;為讀者呈現真實可信的供應商選…