logo
7
0
WeChat Login
chao.xu<chao.xu@unity.cn>
Initial commit

Banner

Boss Room: UOS Hello & Sync Demo

UnityVersion NetcodeVersion

Boss Room Sample Overview

BossRoom 是一款基于 UOS Sync 和 UOS Hello实现的多人在线游戏 Demo,玩家可以在游戏中进行联机游戏、语音通话。

基于 UOS Sync 服务,我们实现了房间大厅、加入房间、创建房间等功能。通过设置 JoinCode,用户可以创建私有房间;通过输入 RoomUUID,玩家可以快速加入已有房间。

基于 UOS Hello 服务, 我们实现了联机语音功能,玩家可以通过游戏中的语音设置,体验空间音频、范围音频等功能。

克隆仓库

如使用git,请开启 git lfs 后再克隆仓库。

软件依赖

BossRoom 使用 Unity 2022.3.41f1c1 开发。为了保证项目的正常运行,建议使用相同版本的 Unity 编辑器打开项目。

本项目使用 UOS Sync 提供联机服务。UOS Sync 提供一站式、高并发、低延迟、可靠的游戏同步解决方案。并且支持主流传输协议,且允许不同客户端以不同的传输协议进行同步。 支持使用 Mirror 或 Netcode 开发的的游戏无缝接入。

本项目试用 UOS Hello 提供语音服务。UOS Hello 是Unity官方推出的,声网提供运营和技术支持的,低延时、高品质全球游戏语音服务,可以让玩家在游戏中实现实时、清晰、流畅的语音交流。全面支持社交、竞技、低耗、世界、指挥等五大模式,提供酣畅淋漓的游戏体验。

在本项目中,我们使用Netcode 1.4.0 作为底层网络框架,使用 WebSocket 作为传输协议。如果您想使用 Mirror 或者其他传输协议,可以参考 UOS Sync 文档 进行配置。

初次打开项目

下载项目后,请按照以下步骤进行操作:

  • 确保您已安装兼容的 Unity 编辑器版本。推荐使用 Unity 2022LTS 及以上版本。

  • 在 Unity Hub 中打开本项目。第一次打开项目需要等待 Unity 导入所有资产。

  • 设置 UOS Sync 服务。

    • 打开菜单栏 UOS->Open Launcher,通过Select Project或填写 App ID、App Secret,、App Service Secret的方式,连接到UOS App。

    • 点击 Assets->Scenes->Startup,然后在 Hierarchy 面板中选中 NetworkManager 对象。Network Transport 方式选择 RelayTransportNetwork。
    • 在下方的 Relay Transport 中输入 Room Profile UUID。为了在 Web 端正常通信,Transport Type 选择 WebSocket。

  • 随后,您就可以点击 Play 开始体验项目,您也可以点击 Build 生成各个平台的可执行文件。


体验游戏

打开游戏,进入主界面。您可以选择创建队伍或者加入队伍。在创建队伍时,您可以设置【队伍暗号】。

在大厅列表,您可以看到当前有哪些队伍正在进行游戏。您可以直接点击队伍加入。

如果该队伍启用了暗号,您需要输入正确暗号后才能加入房间。页面下方,您可以更换自己心爱的冒险家名称。


UOS Hello & Sync 接入指引

1. 注册 UOS 账号

在使用 UOS 服务前,您需要注册 Unity 账号。请访问 Unity 官网 注册账号。

2. 创建 UOS 应用

注册 Unity 账号后,您需要创建一个 UOS 应用。请访问 UOS 网站 点击【立即免费试用】创建应用。

3. 开启 UOS Hello 服务

进入应用后,在【概览】页面找到并开启Hello服务,填写联系人信息后,等待Hello服务正式开通。

4. 开启 UOS Sync 服务

在相同页面开启 Sync 服务。在本项目中,游戏后台逻辑均运行在房主端,故选择 Relay 模式,点击【启用】。

5. 获取房间配置

创建完成后,点击左侧面板【Sync Relay】下的【配置】,即可看到 Room Profile UUID;点击左侧面板【设置】,即可看到 App Id 和 App Secret。将它们拷贝粘贴至 Unity 编辑器中即可。

6. 房间管理

在左侧面板【Sync Relay】下的【房间管理】中,您可以看到当前正在进行的房间。您可以点击【查看】查看房间详情,也可以点击【删除】删除房间。

代码结构

语音模块

语音模块的主要代码请参见 Assets/Scripts/HelloService/RTCAudioProxy.cs

该文件包含了语音部分的主要功能,包括初始化语音引擎、加入频道、离开频道、配置空间音频等。

大厅模块

大厅模块的主要代码请参见 Assets/Scripts/Gameplay/UI/Lobby/LobbyUIMediator.cs

该文件包含了大厅 UI 界面的主要逻辑,包括创建房间、加入房间、刷新房间列表等功能。

以创建房间为例:

public void CreateRoomRequest(string roomName, bool isPrivate, string joinCode)
{
    BlockUIWhileLoadingIsInProgress();
    
    if (string.IsNullOrEmpty(roomName))
    {
        roomName = k_DefaultLobbyName;
    }
    
    if (isPrivate && string.IsNullOrEmpty(joinCode))
    {
        PopupManager.ShowPopupPanel("Join Code required","Please enter a join code for your private room.");
        UnblockUIAfterLoadingIsComplete();
        return;
    }
    
    var createRoomRequest = new CreateRoomRequest()
    {
        Name = roomName,
        MaxPlayers = m_ConnectionManager.MaxConnectedPlayers, 
        PlayerId = m_LocalUser.ID,
        Visibility = isPrivate ? LobbyRoomVisibility.Private : LobbyRoomVisibility.Public, 
        Namespace = k_DefaultLobbyNamespace,
        JoinCode = joinCode,
    };
    
    StartCoroutine(LobbyService.AsyncCreateRoom(createRoomRequest, OnRoomCreated));
}

本例中,我们构造了一个 CreateRoomRequest 对象,包含了房间名称、最大玩家数、房间可见性、房间 Namespace、Join Code 等信息。然后调用 LobbyService.AsyncCreateRoom 方法,向 UOS Sync 服务发送创建房间请求。

在请求完成后,会调用 OnRoomCreated 方法,该方法会将房间信息添加到房间列表中。

private void OnRoomCreated(CreateRoomResponse response)
{
    if (response.Code == (uint)RelayCode.OK)
    {
        // 需要在连接到Relay服务器之前,设置好房间信息
        m_ConnectionManager.NetworkManager.GetComponent<RelayTransportNetcode>().SetRoomData(response);
        
        m_LocalUser.IsHost = true;
        m_LocalRoom.RoomUuid = response.RoomUuid;
        m_LocalRoom.RoomCode = response.RoomUuid;// TODO RoomCode not supported yet, use RoomUuid instead for now
        
        Debug.Log($"Room created by user: {response.OwnerId} and room uuid is {response.RoomUuid}");
        m_ConnectionManager.StartHost(m_LocalUser.DisplayName);
    }
    else
    {
        Debug.Log("Create Room Fail By Lobby Service, code: " + response.Code);
        UnblockUIAfterLoadingIsComplete();
    }
}

在回调函数中,先设置好房间信息,然后调用 ConnectionManager.StartHost 方法,开始创建房间。

其它

Assets/Scripts/ApplicationLifecycle 应用生命周期

Assets/Scripts/ConnectionManagement BossRoom 网络状态机,管理网络连接状态转移。

Assets/Scripts/Gameplay/GameState/ClientMainMenuState.cs 游戏程序入口。

Assets/Scripts/LocalRoomInfo 记录存储在本地的房间与人员信息。

Assets/Scripts/Gameplay/UI/ConnectionStatusMessageUIManager.cs 定义各种弹出的提示框。您可以根据自己的需求增加新的提示信息。

Assets/Scripts/Utils/PlayerIdgenerator.cs 玩家唯一 ID 生成器。在游戏启动时,生成唯一 ID,用于区分不同玩家。您可以根据自己的需求修改生成规则,例如根据玩家登录信息生成 UUID。


疑难解答

Bugs

  • 若您在游玩过程中发现任何 Bug 或者在使用 UOS 服务时有任何困难,欢迎您在 UOS 技术交流 QQ 群(823878269)中反馈。

相关链接

License

参见 LICENSE.md