![Banner](Documentation/Images/Banner.png) # Boss Room - 基于Unity Netcode for GameObjects开发的多人RPG游戏 Boss Room是一个基于Unity Netcode开发的多人协作RPG游戏。它是作为一个在网络游戏中的常见[游戏模式](https://docs-multiplayer.unity3d.com/netcode/current/learn/bossroom-examples/bossroom-actions)的示例游戏开发出来的。 你可以在你自己的Unity游戏中使用这个项目中的任何素材和代码。该项目基于[Unity Companion License](LICENSE.md)开发。 > 重要提醒: > - Boss Room目前已经支持在以下平台上开发和测试 (Windows, Mac, iOS, 和Android). > - Boss Room目前支持最新的Unity LTS版本. > - 在安装Unity Editor时请确保安装了Windows/Mac单独支持。如需要专用游戏服务器的支持,还需要安装Windows/Linux Dedicated Server支持。(Linux还需要安装IL2CPP和Mono的Build支持) ![](Documentation/Images/Boss.png) ![](Documentation/Images/Players.png) ## 获取项目文件 - 该工程可以在[BossRoomDGS PlasticSCM](https://plastichub.unity.cn/unity-tech-cn/BossRoomDGS)中选择`Download Repository`在Unity Hub中下载。 ## 第一次打开项目文件 下载好项目文件后,请按照一下步骤来打开和运行游戏: - 确保安装了推荐版本`2021.3.6f1`或更新的Unity Editor。 - 确保安装了Windows/Mac单独支持。 - 确保安装了Windows/Linux Dedicated Server支持。 - 确保安装了Linux IL2CPP和Mono的Build支持。 - 第一次打开项目时Unity会导入所有的资源文件,这可能会花费较长的时间。 - 当Editor导入结束后,在 _Project_ 窗口中打开 _Project/Startup_ 场景 ![](Documentation/Images/StartupScene.png) - 在此场景中可以点击 **Play** 来运行游戏。 ## 测试多人游戏 为了测试多人游戏联机功能我们可以在开发机上运行多个游戏实例,可以使用`ParrelSync`,也可以通过网络与朋友进行联机,详见[如何测试](https://docs-multiplayer.unity3d.com/netcode/current/tutorials/testing/testing_locally) --------------- ### 本地多人游戏配置 首先我们需要编译出一个可执行程序,在菜单中找到 _File/Build Settings_ 然后点击 **Build** 。 ![](Documentation/Images/BuildProject.png) 编译完成后就可以在本地运行多个游戏实例来做主机和从机。 > Mac用户要运行一个程序的多个实例需要在命令行下执行 `open -n BossRoom.app` --------------- ### 公网上的多人游戏配置 要在公网上实现多人联机,首先需要将可执行文件共享给所有玩家。参考上一部分。 其次则需要有中转网络通信的手段,目前可以有两种选择: * 使用一个Relay服务器来进行中转,目前Boss Room提供了[Unity Relay](https://docs-multiplayer.unity3d.com/netcode/current/relay/relay)的支持。 * 将Boss Room编译成Headless专用游戏服务器,使用[Multiverse](https://multiverse-test.scaling.unity.cn)来托管一个专用的游戏服务器进行中转。 --------------- ### 专用游戏服务器 目前Boss Room支持专用游戏服务器模式,可以支持运行一个无玩家的Headless的服务器。请按照以下步骤进行编译: 1. 在菜单中找到 _File/Build Settings_ 并将编译目标切换成 **Dedicated Server**,目标平台选择 **Windows** 或者 **Linux** 。 ![](Documentation/Images/DedicatedServerLinux.png) 2. 切换好编译目标后(第一次可能会花较长时间),点击 **Build** 。 3. 编译完成后,执行编译出的可执行文件(命令行支持`-port=`的参数来指定服务器监听的端口)。 4. 打开游戏可执行文件,在`Direct IP`模式下连接127.0.0.1的默认端口即可进行联机。 编译出的专用游戏服务器可以上传至游戏服务器托管服务(如[Multiverse](https://multiverse-test.scaling.unity.cn))。 ## 与Multiverse进行集成 Multiverse是一个基于Kubernetes的游戏服务器托管服务。游戏开发者可以将自己的游戏服务器打包成Docker镜像,方便地进行弹性的游戏服务器运行/销毁。 > 重要提醒: > 目前Multiverse只支持Linux的Docker镜像。 以Boss Room游戏为例,请按照以下步骤来将你的游戏与Multiverse进行集成: ### 集成Multiverse SDK **Multiverse SDK**是游戏服务器用来维护在Multiverse中的状态和生命周期的。 > 重要提醒: > 目前Multiverse只提供了Unity的SDK(其他语言的SDK会陆续放出)。 1. 将Unity SDK的代码添加到Unity Project中。 2. 给专用游戏服务器的运行入口添加Multiverse SDK的依赖。修改`Assets/Scripts/Gameplay/Unity.BossRoom.Gameplay.asmdef`: ```json "references": [ ... ... "Unity.BossRoom.ConnectionManagement", "VContainer", "Unity.Cn.Multiverse" ], ``` 3. 在Unity Editor Project窗口,搜索`DSLobbyManagementState`, 给专用游戏服务器的运行入口`DSLobbyManagementState(Prefab Asset)`添加一个`Multiverse SDK`的组件。 ![](Documentation/Images/AddMultiverseComponent.png) 4. 修改`DSLobbyManagementState.cs`,添加MultiverseSDK的初始化代码。 ```csharp using VContainer; using Unity.Cn.Multiverse; ... ... public class DSLobbyManagementState : GameStateBehaviour { [Inject] ConnectionManager m_ConnectionManager; public override GameState ActiveState => GameState.DedicatedServerLobbyManagement; private MultiverseSdk m_Multiverse = null; ... ... IEnumerator StartServerCoroutine() { DedicatedServerUtilities.Log($"Starting Headless Server, listening on address {address}:{port}"); m_ConnectionManager.StartServerIP(address, port); // This will switch to the char select scene once the server started callback has been called // Start the multiverse SDK StartMultiverse(); yield return new WaitForServerStarted(); // Less performant than just the callback, but way more readable than a callback hell. // TODO change scene to char select here and do other init. why is it handled by connection manager right now? SceneLoaderWrapper.Instance.AddOnSceneEventCallback(); SceneLoaderWrapper.Instance.LoadScene(SceneNames.CharSelect, useNetworkSceneManager: true); } ... ... private async void StartMultiverse() { m_Multiverse = GetComponent(); bool ok = await m_Multiverse.Connect(); if (ok) { Debug.Log(("Server - Connected")); } else { Debug.Log(("Server - Failed to connect, exiting")); Application.Quit(1); } ok = await m_Multiverse.Ready(); if (ok) { Debug.Log($"Server - Ready"); } else { Debug.Log($"Server - Ready failed"); Application.Quit(); } } ``` ### 编译游戏服务器 1. 在菜单中找到 _File/Build Settings_ 并将编译目标切换成 **Dedicated Server**,目标平台选择 **Linux** 。 ![](Documentation/Images/DedicatedServerLinux.png) 2. 切换好编译目标后(第一次可能会花较长时间),点击 **Build** ,并保存为`BossRoom.x86_64`。 3. 将编译出的目录打包成zip文件:`BossRoom.zip`(打包时请保持`BossRoom.x86_64`文件在zip包根目录)。 ### 创建Multiverse Game 1. 在[Multiverse快速向导](https://multiverse-test.scaling.unity.cn/console/start)中开始Multiverse Game的创建。注意:由于docker镜像名字的限制,游戏名称暂时不可以包含大写字母。 ![](Documentation/Images/MultiverseStep1.png) 2. 创建游戏档案。对于BossRoom的游戏服务器,推荐至少512mb的内存限制。 ![](Documentation/Images/MultiverseStep2.png) 3. 创建游戏镜像。注意:容器端口填游戏服务器的默认端口`9998`。可执行文件填`BossRoom.x86_64`,该参数指的是游戏服务器可执行文件在zip包中的相对路径。在选择游戏包中选择刚才打包好的`BossRoom.zip`。上传结束后,点击`创建游戏镜像`。创建结束后,点击`提交游戏镜像`来将该镜像用于正式游戏服务器托管。 ![](Documentation/Images/MultiverseStep3.png) 4. 创建游戏地域。 ![](Documentation/Images/MultiverseStep4.png) 5. 创建并启用游戏档案可用区。 ![](Documentation/Images/MultiverseStep5.png) ### 在Multiverse中创建游戏服务器 1. 在Multiverse游戏服务器面板,点击 **分配游戏服务器** ,创建一个指定游戏档案的游戏服务器。 ![](Documentation/Images/MultiverseStep6.png) 2. 刷新游戏服务器列表,获取刚刚建立的游戏服务器地址。 ![](Documentation/Images/MultiverseStep7.png) 3. 打开Boss Room游戏客户端,在 **Join With IP** 面板,输入刚刚获得的地址。(可打开两个客户端一起游玩)。 ![](Documentation/Images/MultiverseStep8.png) 4. 双方都加入后,即可联网进行游戏。 ![](Documentation/Images/MultiverseStep9.png) > 关于Multiverse的详细文档,请参见https://xxxx