0_1646213235093_test.png

需求

很多初学者曾向我询问关于给房间加密码的问题. 这里我们用 Unity 的官方示例项目来进行举例, 增加密码保护 Room 的功能.

实现

  • 导入Colysues SDK
    有两种方法导入 Colyseus SDK 到 Unity 中:

使用 Package Manager
较新版本的 Unity 将扩展包集中在 Package Manager 中管理, 使用 Package Manager 可以保证导入的 SDK 保持最新版本.
1, Window > Package Manager
2, 按 "+" 添加 git url: https://github.com/colyseus/colyseus-unity3d.git#upm
3, 点击 "ADD".
0_1646215396041_1.png

使用 Colyseus_Plugin.unitypackage
这篇文章所用到的示例项目代码位于官方的 unitypackage 中, 所以要从
https://github.com/colyseus/colyseus-unity3d/releases/tag/0.14.10
下载 Colyseus_Plugin.unitypackage 文件, 拖入新建好的 Unity 项目中, 全选导入即可.
0_1646215156625_2.png
我们的示例代码就在 Colyseus - Runtime - Example 文件夹下, 服务器代码在 Server 文件夹下.

  • 运行示例项目
    首先进入服务器, 运行
cd Server
npm install
npm start

然后进入客户端 Unity, 点击播放按钮, 或者编译 WebGL 客户端在浏览器中运行.
登录服务器, 新建房间. 通过控制台可以看到客户端与服务器的交互步骤与同步信息.
该项目很好地演示了一个极小的 MMO 游戏应该具有的功能.

  • 添加密码功能
    这篇文章旨在演示密码功能的实现, 代码非常不严谨, 请勿用于商业用途.
    1, 客户端
    我们的需求很简单: 开房间用户设置房间密码, 申请进入房间的时候验证密码.
    在 LobbyScene 如图所示的地方加入 InputField.
    0_1646219135226_3.png
    这里用于开房间的用户设置密码.
    主要代码:
    public void CreateRoom()
    {
        connectingCover.SetActive(true);
        string desiredRoomName = selectRoomMenu.RoomCreationName;
        string desiredRoomPassword = selectRoomMenu.RoomCreationPassword;
        if (!string.IsNullOrEmpty(desiredRoomName))
        {
            Dictionary<string, object> options = new Dictionary<string, object>() { {"password",desiredRoomPassword} };
            LoadGallery(() => ExampleManager.Instance.CreateNewRoom(desiredRoomName, options));
        }
    }

在 RoomEntry 这个 Prefab 里如图所示的地方加入 InputField.
0_1646219287949_4.png
这里用于想进入房间的用户输入密码.
主要代码:

    public void JoinRoom(string id, string password)
    {
        connectingCover.SetActive(true);
        Dictionary<string, object> options = new Dictionary<string, object>() { {"password", password} };
        LoadGallery(() => { ExampleManager.Instance.JoinExistingRoom(id, options); });
    }

2, 服务端
我们的需求很简单: 没密码的房间随便进, 有密码的房间验证成功可以进, 否则不允许进入.
主要代码:

  onAuth (client: Client, options: any, request): boolean {
      /**
       * You can immediatelly return a `boolean` value.
       */
      if (this.roomOptions.password == null || this.roomOptions.password == "" || options.password == this.roomOptions.password) {
          return true;

      } else {
          throw new ServerError(400, "bad access token");
      }
      return false;
  }
  • 运行测试
    0_1646220062454_5.png
    可以看到没密码的房间或者密码输入正确的房间能顺利进入; 密码输入错误的房间会抛出代号400的错误, 这个错误被从服务器抛出至客户端, 然后服务器拒绝了客户端的房间进入请求.

下一步

  • 在 state 中加入 "有密码" 标志位
    时刻牢记 "state" 的用途是客户端与服务端同步的数据. 所以密码当然不能就这么保存在 state 中. 但是, 在 state 中加入一个布尔标志提示客户端该房间是否有密码或者在服务器端屏蔽掉这个密码却是个不错的主意.

  • 密码输入错误的异常处理
    抛出错误不加处理对用户来说很不友好. 可以尝试 catch 这个 error, 弹出提示窗口或者请用户重新输入密码, 连续错误限制等等功能, 就由聪明的你来尝试加入啦!

  • 上传代码到 Arena
    Arena 是专门托管 Colyseus 服务代码并提供自由资源伸缩的云服务. 把代码托管到 Colyseus Arena 上吧! 这样你就拥有了自己的第一款正式的 MMO 游戏! 测试免费哦!

参考

https://docs.colyseus.io/colyseus/getting-started/unity3d-client/
https://github.com/colyseus/colyseus-unity3d
https://github.com/CocosGames/ColyseusUnityPasswordRooms
https://docs.colyseus.io/colyseus/how-to/password-protect-room/
https://console.colyseus.io/
https://support.colyseus.io/support/login

顺便说一句, Unity 新功能有个中文界面支持, 不要打开它! 否则本来正常的项目都会报错!