void IRoomRPCMethodClient.onPlayerPropChange(int playerID, string name, object val)
        {
            log?.logTrace($"{this.name} 收到玩家属性改变事件。玩家ID:{playerID}, Key: {name}, Value: {val}");

            cachedRoomData.setPlayerProp(playerID, name, val);
            OnRoomPlayerDataChanged?.Invoke(cachedRoomData.playerDataList.ToArray());
        }
        void IRoomRPCMethodClient.onPlayerRemove(int playerID)
        {
            log?.logTrace($"{name} 收到移除玩家事件。玩家ID:{playerID}");

            if (!cachedRoomData.containsPlayer(playerID))
            {
                log?.logWarn($"{name} 的房间信息中不存在存在ID为{playerID}的玩家,但却收到了 onPlayerRemove 事件,这是有问题的。");
                return;
            }
            cachedRoomData.playerDataList.RemoveAll(p => p.id == playerID);
            OnRoomPlayerDataChanged?.Invoke(cachedRoomData.playerDataList.ToArray());
        }
        void IRoomRPCMethodClient.updatePlayerData(RoomPlayerData data)
        {
            log?.logTrace($"{name} 收到玩家信息改变事件。玩家信息: {data}");

            for (int i = 0; i < cachedRoomData.playerDataList.Count; i++)
            {
                if (cachedRoomData.playerDataList[i].id == data.id)
                {
                    cachedRoomData.playerDataList[i] = data;
                }
            }
            OnRoomPlayerDataChanged?.Invoke(cachedRoomData.playerDataList.ToArray());
        }
 void IRoomRPCMethodClient.onPlayerAdd(RoomPlayerData data)
 {
     log?.logTrace($"{name} 收到新增玩家事件。玩家信息:{data}");
     if (cachedRoomData.containsPlayer(data.id))
     {
         log?.logWarn($"{name} 的房间信息中已经存在ID为{data.id}的玩家,但却收到了 onPlayerAdd 事件,这是有问题的。");
         for (int i = 0; i < cachedRoomData.playerDataList.Count; i++)
         {
             if (cachedRoomData.playerDataList[i].id == data.id)
             {
                 cachedRoomData.playerDataList[i] = data;
             }
         }
     }
     else
     {
         cachedRoomData.playerDataList.Add(data);
     }
     OnRoomPlayerDataChanged?.Invoke(cachedRoomData.playerDataList.ToArray());
 }
 /// <summary>
 /// 触发 OnRoomPlayerDataChanged 事件
 /// </summary>
 /// <param name="data"></param>
 protected void invokeOnRoomPlayerDataChanged(RoomPlayerData[] data)
 {
     OnRoomPlayerDataChanged?.Invoke(data);
 }