艾爾登復刻Ep1——客戶端制作、場景切換、網絡控制

需要添加的插件內容

Netcode for GameObjects:是一個為 Unity 游戲開發提供高級網絡功能的 SDK。它的主要作用是允許開發者在其 GameObject 和 MonoBehaviour 工作流中集成網絡功能,并且可以與多種底層傳輸層協議兼容。

具體內容請看:https://zhuanlan.zhihu.com/p/669642159

ParrelSync:ParrelSync 是一個 Unity 編輯器擴展,旨在幫助開發者在沒有構建項目的情況下測試多人游戲玩法。通過使用 ParrelSync,開發者可以在多個 Unity 編輯器窗口中同時運行項目,從而快速測試多人游戲的功能和同步問題。

具體內容請看:ParrelSync 安裝和配置指南-CSDN博客

客戶端制作

Network manager?

? ? ? ? 添加了Net for work腳本后,可以給物體掛載Network manager腳本。我們需要創建一個空物體,并將該腳本掛載上。

編寫客戶端控制腳本

這段腳本代碼的作用是管理游戲的標題屏幕,提供兩個主要功能:

  1. 啟動網絡會話作為主機(StartNetworkAsHost),允許其他客戶端連接。

  2. 開始一個新游戲(StartNewGame),加載游戲的初始狀態。

using SG;
using System.Collections;
using System.Collections.Generic;
using Unity.Netcode;
using UnityEngine;namespace SG
{public class TitleScreenManager : MonoBehaviour{// Start is called before the first frame updatepublic void StartNetworkAsHost(){NetworkManager.Singleton.StartHost();}public void StartNewGame(){StartCoroutine(WorldSaveManager.instance.LoadNewGame());}}}

命名空間:?

  • namespace SG:定義了一個命名空間,用于組織代碼,避免命名沖突。

    • 團隊開發中,不同開發者可能會使用相同的標識符名稱(如函數、類、變量等),導致命名沖突。命名空間通過為標識符添加一個前綴(即命名空間名稱),將標識符限定在一個特定的作用域內,從而避免了全局作用域中的命名沖突。

StartNetworkAsHost方法:

  • 這個方法的作用是啟動一個網絡主機(Host)。在Unity Netcode中,主機既是服務器又是客戶端,可以允許其他客戶端連接到它
  • NetworkManager.Singleton.StartHost();:
    • NetworkManager是Unity Netcode(以前稱為UNet)中的一個單例類,用于管理網絡會話。

    • SingletonNetworkManager的單例實例,確保在整個應用程序中只有一個NetworkManager對象。

    • StartHost()NetworkManager的一個方法,用于啟動主機模式。當用戶調用StartHost()時,實際上是讓用戶的電腦設備承擔了主機的角色,同時運行服務器和客戶端的功能。

StartNewGame方法:

  • 這個方法用于開始一個新游戲。
    • WorldSaveManager.instance:假設WorldSaveManager是一個單例模式的管理器類,instance是其唯一的實例。

    • LoadNewGame():這是一個協程方法,用于加載新游戲。協程在Unity中用于執行需要分多個幀完成的操作,通常用于避免主線程阻塞。

? ? ? ? 注意,這個掛載Network Manager腳本的空物體要加入預制體,在Unity中,將腳本掛載在空物體上作為單例管理器是一種常見的設計模式,這種模式能夠確保在整個游戲或應用中只有一個實例存在,并且提供了一個全局的訪問點,要添加至Asset—prefabs中。

掛載unity?import

????????將 Unity Transport 掛載在 NetworkManager 物體上,是為了讓 NetworkManager 使用它來處理網絡連接和數據傳輸。Unity Transport 作為 NetworkManager 的傳輸層,負責實際的網絡通信工作,使得 NetworkManager 能夠通過網絡與其他客戶端或服務器進行交互。

? ? ? ? 將腳本Unity Transport掛載到Network Transport

編寫切換大世界場景腳本?

????????用于Unity游戲引擎中的世界保存管理器(WorldSaveManager)。它的主要功能是管理游戲世界的加載。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;namespace SG
{public class WorldSaveManager : MonoBehaviour{// Start is called before the first frame updatepublic static WorldSaveManager instance;[SerializeField] int worldSceneIndex = 1;private void Awake(){if (instance == null){instance = this;}else{Destroy(gameObject);}}private void Start(){DontDestroyOnLoad(gameObject);}public IEnumerator LoadNewGame(){AsyncOperation loadOperation = SceneManager.LoadSceneAsync(worldSceneIndex);yield return null;}}
}
[SerializeField] int worldSceneIndex = 1;
  • 這是一個Unity提供的特性(Attribute),用于指定一個私有字段(private field)應該在Unity編輯器的Inspector面板中顯示并可編輯。

  • 通常情況下,私有字段不會在Inspector面板中顯示,但添加了[SerializeField]特性后,該字段就會在Inspector中可見,允許你在編輯器中直接修改它的值。?

private void Start()
{DontDestroyOnLoad(gameObject);
}

?這是Unity的另一個生命周期方法,在Awake之后調用。在這里,它調用了DontDestroyOnLoad方法,確保WorldSaveManager實例在場景切換時不會被銷毀。

public IEnumerator LoadNewGame()
{AsyncOperation loadOperation = SceneManager.LoadSceneAsync(worldSceneIndex);yield return null;
}?

????????這段代碼的作用是啟動一個異步操作,用于加載指定索引的場景。加載過程不會阻塞主線程,游戲可以繼續運行,同時場景在后臺加載。

  • SceneManager.LoadSceneAsync(worldSceneIndex):使用Unity的場景管理器異步加載指定索引的場景(這里是worldSceneIndex)。

    • SceneManager.LoadSceneAsync:這是Unity引擎中SceneManager類的一個靜態方法,用于異步加載場景。

    • AsyncOperation:這是一個返回值類型,表示異步操作的對象。通過這個對象,可以監聽頁面加載的進度和狀態。

  • yield return null:這是一個協程的暫停點,表示在下一幀繼續執行。這里可能需要進一步的邏輯來處理場景加載的完成,比如等待加載完成后再繼續執行其他操作


????????Q1:什么是異步操作?

? ? ? ? A1:異步操作是指一個操作在啟動后,不會立即阻塞當前線程的執行,而是允許當前線程繼續處理其他任務,直到該操作完成。

????????????????異步操作通常用于執行耗時的任務,例如文件讀寫、網絡請求、場景加載等,以避免主線程被阻塞,導致應用程序響應遲緩或卡頓。

? ? ? ? Q2:為什么這里要用異步操作?

? ? ? ? A2:在Unity中,加載場景是一個耗時的操作,特別是當場景包含大量資源(如模型、紋理、動畫等)時。如果使用同步加載(即SceneManager.LoadScene),主線程會被阻塞,直到場景加載完成。這會導致游戲在加載期間出現卡頓,甚至完全凍結,嚴重影響用戶體驗。

????????????????通過使用異步加載(即SceneManager.LoadSceneAsync),場景的加載過程會在后臺進行,而主線程可以繼續處理其他任務,例如更新UI、播放加載動畫、響應用戶輸入等。這樣可以確保游戲在加載場景時仍然保持流暢的運行。

????????注意,這個掛載world Save Manager腳本的空物體要加入預制體?

????????

如何設置場景序號

1、先將當前客戶端場景——save as——保存到Asset——Scene中(相當于另存一份),再刪去多余的一份。

2、為場景添加序號

? ? ? ? 進入當前場景后,進入Building Setting界面,點擊Add Open Scenes

為客戶端設置按鈕?

1、button的第一個設定:使網絡會話作為主機(StartNetworkAsHost),允許其他客戶端連接。

2、button的第二個設定:隱藏Start Game游戲欄

3、button的第三個設定:顯示New Game游戲欄

4、button的第四個設定:Select 方法會將按鈕設置為選中狀態,這通常會觸發按鈕的選中效果(如高亮設置等視覺效果)

? ? ? ? 將Screen Manager腳本掛載至Screen Canvas


? ? ? ? 將Screen Canvas物體掛載到New Game游戲欄的按鈕上,即點擊New Game欄時,進入游戲場景

設置游戲角色管理腳本?

using System.Collections;
using System.Collections.Generic;
using Unity.Netcode;
using UnityEngine;namespace SG
{public class CharacterManger : MonoBehaviour{public static CharacterManger instance;[Header("NETWORK JOIN")][SerializeField] bool startGameAsClient;private void Awake(){if (instance == null){instance = this;}else{Destroy(gameObject);}}private void Start(){DontDestroyOnLoad(gameObject);}private void Update(){if (startGameAsClient){startGameAsClient = false;NetworkManager.Singleton.Shutdown();NetworkManager.Singleton.StartClient();}}}
}
[Header("NETWORK JOIN")]
[SerializeField] bool startGameAsClient;
  • bool startGameAsClient;:一個布爾變量,用于決定游戲啟動時是否作為客戶端加入游戲
  • [Header("NETWORK JOIN")] 的作用是將下面的變量 [SerializeField] bool startGameAsClient; 歸類到"NETWORK JOIN"這一部分


    這樣在Unity編輯器中,這個變量會顯示在檢查器面板的"NETWORK JOIN"標題下。

if (startGameAsClient)
{startGameAsClient = false;NetworkManager.Singleton.Shutdown();NetworkManager.Singleton.StartClient();
}
  1. if (startGameAsClient)

    • 檢查startGameAsClient是否為true。如果是,表示需要以客戶端模式加入游戲。

  2. startGameAsClient = false;

    • startGameAsClient設置為false,以確保這個邏輯只執行一次,避免重復觸發。

  3. NetworkManager.Singleton.Shutdown();

    • 調用NetworkManager的單例實例的Shutdown方法。

    • 作用:關閉當前的網絡管理器,清理網絡狀態。

    • 目的:確保在重新啟動客戶端連接之前,清除任何現有的網絡連接和狀態,避免沖突或資源泄漏。

  4. NetworkManager.Singleton.StartClient();

    • 調用NetworkManager的單例實例的StartClient方法。

    • 作用:以客戶端模式啟動網絡連接,使游戲客戶端連接到服務器。?

?使動畫角色對應網絡連接

? ? ? ? 安裝了網絡插件后,為了讓場景角色也有網絡效應,我們要給物體加上該組件



? ? ? ? 將物體掛載到NetworkManager的Player Prefab上,但需要注意:不同場景下執行掛載操作產生的效果不同

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

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

相關文章

2025探索短劇行業新可能報告40+份匯總解讀|附PDF下載

原文鏈接:https://tecdat.cn/?p41043 近年來,短劇以其緊湊的劇情、碎片化的觀看體驗,迅速吸引了大量用戶。百度作為互聯網巨頭,在短劇領域積極布局。從早期建立行業專屬模型冷啟動,到如今構建完整的商業生態&#xf…

正常的一個編碼器的架構是怎么樣,有哪些模塊構成

正常的一個編碼器架構及其模塊構成 在音視頻編碼器(Video Encoder)中,通常包括多個核心模塊,整個編碼器架構遵循 輸入 -> 預處理 -> 編碼核心 -> 碼流封裝 的流程。 1. 編碼器的整體架構 編碼器的主要架構如下&#xf…

文件解析漏洞練習

iis6的目錄解析漏洞 (.asp目錄中的所有文件都會被當做asp文件執行) 1.在iis的網站根目錄新建一個名為x.asp的文件 2.在x.asp中新建一個jpg文件。內容為<%now()%> asp代碼。 3.在外部瀏覽器中訪問windows2003的iis網站中的2.jpg 發現asp代碼被執行 iis6的分號截斷解析漏洞…

SQL Server性能優化實戰:從瓶頸定位到高效調優

引言 在數據庫應用中,性能問題直接影響用戶體驗和系統穩定性。本文基于實際案例,分享SQL Server性能優化的關鍵步驟與實用技巧,涵蓋問題定位、索引優化、查詢調優等多個維度。 目錄 引言 一、性能瓶頸定位 1.1 監控工具使用 二、索引優化實戰 2.1 索引碎片整理 2.2 缺…

【DNS系列】使用TCP傳輸

DNS ?默認使用UDP協議?&#xff08;端口53&#xff09;進行通信&#xff0c;但在以下場景中會切換到TCP協議?&#xff08;端口53&#xff09;&#xff1a; ?1. 響應數據過大&#xff08;超過512字節&#xff09;? ?UDP限制&#xff1a;DNS的UDP協議默認限制單個數據包大…

Go Ebiten小游戲開發:俄羅斯方塊

在這篇文章中&#xff0c;我們將一起開發一個簡單的俄羅斯方塊游戲&#xff0c;使用Go語言和Ebiten游戲庫。Ebiten是一個輕量級的游戲庫&#xff0c;適合快速開發2D游戲。我們將逐步構建游戲的基本功能&#xff0c;包括游戲邏輯、圖形繪制和用戶輸入處理。 項目結構 我們的項…

MySQL中IN關鍵字與EXIST關鍵字的比較

文章目錄 **功能等價性分析****執行計劃分析**&#xff1a; **1. EXISTS 的工作原理****步驟拆解**&#xff1a; **2. 為什么需要“利用索引快速定位”&#xff1f;****索引作用示例**&#xff1a; **3. 與 IN 子查詢的對比****IN 的工作方式**&#xff1a;**關鍵差異**&#x…

## DeepSeek寫水果記憶配對手機小游戲

DeepSeek寫水果記憶配對手機小游戲 提問 根據提的要求&#xff0c;讓DeepSeek整理的需求&#xff0c;進行提問&#xff0c;內容如下&#xff1a; 請生成一個包含以下功能的可運行移動端水果記憶配對小游戲H5文件&#xff1a; 要求 可以重新開始游戲 可以暫停游戲 卡片里的水果…

【含文檔+PPT+源碼】基于Django框架的鄉村綠色農產品交易平臺的設計與實現

項目介紹 本課程演示的是一款基于Django框架的鄉村綠色農產品交易平臺的設計與實現&#xff0c;主要針對計算機相關專業的正在做畢設的學生與需要項目實戰練習的 Python學習者。 1.包含&#xff1a;項目源碼、項目文檔、數據庫腳本、軟件工具等所有資料 2.帶你從零開始部署運…

idea超級AI插件,讓 AI 為 Java 工程師

引言? 用戶可在界面中直接通過輸入自然語言的形式描述接口的需求&#xff0c;系統通過輸入的需求自動分析關鍵的功能點有哪些&#xff0c;并對不確定方案的需求提供多種選擇&#xff0c;以及對需求上下文進行補充&#xff0c;用戶修改確定需求后&#xff0c;系統會根據需求設…

@RestControllerAdvice注解

RestControllerAdvice RestControllerAdvice 是 Spring Framework&#xff08;3.2&#xff09;和 Spring Boot 中用于全局處理控制器層異常和統一響應格式的注解。它結合了 ControllerAdvice 和 ResponseBody 的功能&#xff0c;能夠攔截控制器方法拋出的異常&#xff0c;并以 …

ActiveMQ監聽器在MQ重啟后不再監聽問題

應用的監聽器注解 JmsListener(destination "TopicName",containerFactory "FactoryName")工廠代碼 BeanJmsListenerContainerFactory<?> FactoryName(ConnectionFactory connectionFactory){SimpleJmsListenerContainerFactory factory new S…

大白話 Vue 中的keep - alive組件,它的作用是什么?在什么場景下使用?

大白話 Vue 中的keep - alive組件&#xff0c;它的作用是什么&#xff1f;在什么場景下使用&#xff1f; 什么是 keep-alive 組件 在 Vue 里&#xff0c;keep-alive 是一個內置組件&#xff0c;它就像是一個“保存盒”&#xff0c;能把組件實例保存起來&#xff0c;而不是每次…

考研復試c語言常見問答題匯總2

11. 關鍵字和一般標識符有什么不同&#xff1f; C語言中關鍵字與一般標識符區別&#xff1a; 定義&#xff1a;關鍵字是C語言預定義的特殊單詞&#xff08;如int、for&#xff09;&#xff0c;有固定含義&#xff1b;標識符是自定義的名稱&#xff08;如變量名、函數名&#xf…

Scala編程_實現Rational的基本操作

在Scala中實現一個簡單的有理數&#xff08;Rational&#xff09;類&#xff0c;并對其進行加法、比較等基本操作. 有理數的定義 有理數是可以表示為兩個整數的比值的數&#xff0c;通常形式為 n / d&#xff0c;其中 n 是分子&#xff0c;d 是分母。為了確保我們的有理數始終…

若依框架-給sys_user表添加新字段并獲取當前登錄用戶的該字段值

目錄 添加字段 修改SysUser類 修改SysUserMapper.xml 修改user.js 前端獲取字段值 添加字段 若依框架的sys_user表是沒有age字段的&#xff0c;但由于業務需求&#xff0c;我需要新添加一個age字段&#xff1a; 修改SysUser類 添加age字段后&#xff0c;要在SysUser類 …

霍夫變換法是基于傳統視覺特征的道路車道線檢測算法中的一種經典方法

霍夫變換法是基于傳統視覺特征的道路車道線檢測算法中的一種經典方法&#xff0c;以下是對它的詳細介紹&#xff1a; 基本原理 霍夫變換的基本思想是將圖像空間中的點映射到參數空間中&#xff0c;通過在參數空間中尋找峰值來確定圖像中特定形狀的參數。在車道線檢測中&#…

【論文筆記】Best Practices and Lessons Learned on Synthetic Data for Language Models

論文信息 論文標題&#xff1a;Best Practices and Lessons Learned on Synthetic Data for Language Models 作者信息&#xff1a; Ruibo Liu, Jerry Wei, Fangyu Liu, Chenglei Si, Yanzhe Zhang, Jinmeng Rao, Steven Zheng, Daiyi Peng, Diyi Yang, Denny Zhou1 and Andre…

Android調試工具之ADB

Android Debug Bridge ADB介紹**一、ADB下載****二、ADB安裝****三、ADB基礎使用命令** ADB介紹 ADB&#xff08;Android Debug Bridge&#xff09;是Android開發與調試的必備工具&#xff0c;掌握它能極大提升開發效率。 一、ADB下載 Windows版本&#xff1a;https://dl.goo…

第三篇《RMAN 備份與恢復指南:保障數據庫安全》(RMAN)

《Oracle 數據遷移與備份系列》 第三篇&#xff1a;《RMAN 備份與恢復指南&#xff1a;保障數據庫安全》&#xff08;RMAN&#xff09; 1.概述 RMAN&#xff08;Recovery Manager&#xff09; 是 Oracle 數據庫內置的專用備份與恢復工具&#xff0c;提供高效、安全的物理級數…