# 多人联机

TapTap 小游戏多人联机服务为开发者提供了完整的多人游戏解决方案。

# 一、功能介绍

# 核心功能

  • 房间管理 - 支持创建房间、自动匹配和加入指定房间,提供完善的房间内玩家管理功能
  • 消息传递 - 房间内玩家之间可以自由发送和接收游戏消息,实现游戏数据同步
  • 事件驱动 - 基于事件监听器的异步通知机制,实时响应房间和游戏状态变化
  • 高级特性 - 针对高实时性竞技游戏,SDK 还提供帧同步和确定性随机数等功能

# 二、快速开始

# 1. 接入前提

在使用多人联机功能前,请确保:

  1. 已在 TapTap 开发者中心 (opens new window) 创建应用
  2. 已接入 TapTap 小游戏 SDK 并完成用户登录

# 2. 基本流程

多人联机的典型流程:

1. 用户登录 → 2. 进入房间(创建/匹配/加入) → 3. 游戏内通信 → 4. 离开房间
  • 步骤 1:房间管理 - 创建或加入多人房间
  • 步骤 2:数据通信 - 玩家之间发送和接收游戏消息

# 三、实现多人游戏

# 第一步:房间管理

房间是多人联机的核心概念,所有玩家必须先进入房间才能进行游戏。

# 核心概念

  • 房间 ID:全局唯一标识符
  • 房主:创建房间的玩家,拥有特殊权限(踢人、修改房间属性、开始对战)
  • 玩家列表:房间内所有玩家的信息
  • 房间配置:最大玩家数、房间类型、匹配参数等

# 进入房间的三种方式

  1. 创建房间(CreateRoom)- 自己建房等待其他人加入
  2. 自动匹配(MatchRoom)- 系统自动分配或创建房间(推荐)
  3. 加入指定房间(JoinRoom)- 通过房间 ID 直接加入

# 房间管理功能

  • 玩家管理:监听玩家进出、踢出玩家、离开房间
  • 属性管理:更新房间属性、玩家状态、玩家属性
  • 数据同步:所有属性变更会通知房间内所有玩家

详细说明:请查看 房间管理,包含完整的创建、加入、管理流程和代码示例

# 第二步:游戏内消息通信

当玩家进入房间后,就可以通过消息传递实现游戏数据的同步。

# 实现流程

  1. 玩家进入房间 - 通过匹配或创建房间进入游戏
  2. 等待玩家准备 - 可选:通过 UpdatePlayerCustomStatus 设置玩家准备状态
  3. 开始游戏 - 当所有玩家准备就绪,开始游戏
  4. 发送游戏消息 - 玩家执行操作时,使用 SendCustomMessage 发送游戏数据
  5. 接收游戏消息 - 通过 OnCustomMessage 事件接收其他玩家的操作
  6. 更新游戏状态 - 解析消息并更新本地游戏画面
  7. 游戏结束 - 调用 LeaveRoom 离开房间

# 核心 API

发送自定义消息

TapBattleClient.SendCustomMessage(new SendCustomMessageOption
{
    data = new SendCustomMessageData
    {
        msg = JsonUtility.ToJson(gameData),
        type = 0,  // 0: 发送给除自己外的所有玩家,1: 发送给指定玩家
    },
    success = (result) => Debug.Log("发送成功"),
    fail = (error) => Debug.LogError($"发送失败: {error.message}")
});

接收自定义消息

public class MyBattleEventHandler : ITapBattleEventHandler
{
    public void OnCustomMessage(CustomMessageInfo info)
    {
        // info.playerId: 消息发送者的玩家ID
        // info.msg: 消息内容(UTF-8字符串)

        // 解析消息内容
        var message = JsonUtility.FromJson<GameMessage>(info.msg);

        // 应用到本地游戏状态
        ApplyGameAction(message);
    }
}

详细说明:请查看 数据通信,包含完整的实现流程、最佳实践和注意事项

# 第三步:高级特性(可选)

针对 FPS、MOBA 等高实时性竞技游戏,SDK 提供了帧同步功能:

  • 所有客户端使用相同的确定性逻辑计算状态,保证多端完全一致
  • 客户端只上传输入指令,服务器统一广播帧数据
  • 实时性极高,但实现复杂度较高

适用场景:仅在对实时性和状态一致性有极高要求时使用(如格斗、射击类游戏)

相关 API

  • TapBattleClient.StartFrameSync - 开始帧同步
  • TapBattleClient.SendFrameInput - 发送帧输入指令
  • TapBattleClient.StopFrameSync - 停止帧同步

# 四、开发建议

# 消息频率控制

  • 限制SendCustomMessageUpdateRoomProperties 共享每秒 15 次的调用限制
  • 建议:合理控制发送频率,避免短时间内大量发送消息
  • 优化:对于高频操作,可以考虑合并多个操作后再发送

# 消息结构设计

推荐使用清晰的消息结构:

public class GameMessage
{
    public string type;      // 消息类型(如 "move", "attack", "play_card")
    public object data;      // 具体操作数据
    public long timestamp;   // 时间戳(可选)
}

# 更详细教程文档: