# 多人联机
TapTap 小游戏多人联机服务为开发者提供了完整的多人游戏解决方案。
# 一、功能介绍
# 核心功能
- 房间管理 - 支持创建房间、自动匹配和加入指定房间,提供完善的房间内玩家管理功能
- 消息传递 - 房间内玩家之间可以自由发送和接收游戏消息,实现游戏数据同步
- 事件驱动 - 基于事件监听器的异步通知机制,实时响应房间和游戏状态变化
- 高级特性 - 针对高实时性竞技游戏,SDK 还提供帧同步和确定性随机数等功能
# 二、快速开始
# 1. 接入前提
在使用多人联机功能前,请确保:
- 已在 TapTap 开发者中心 (opens new window) 创建应用
- 已接入 TapTap 小游戏 SDK 并完成用户登录
# 2. 基本流程
多人联机的典型流程:
1. 用户登录 → 2. 进入房间(创建/匹配/加入) → 3. 游戏内通信 → 4. 离开房间
- 步骤 1:房间管理 - 创建或加入多人房间
- 步骤 2:数据通信 - 玩家之间发送和接收游戏消息
# 三、实现多人游戏
# 第一步:房间管理
房间是多人联机的核心概念,所有玩家必须先进入房间才能进行游戏。
# 核心概念
- 房间 ID:全局唯一标识符
- 房主:创建房间的玩家,拥有特殊权限(踢人、修改房间属性、开始对战)
- 玩家列表:房间内所有玩家的信息
- 房间配置:最大玩家数、房间类型、匹配参数等
# 进入房间的三种方式
- 创建房间(CreateRoom)- 自己建房等待其他人加入
- 自动匹配(MatchRoom)- 系统自动分配或创建房间(推荐)
- 加入指定房间(JoinRoom)- 通过房间 ID 直接加入
# 房间管理功能
- 玩家管理:监听玩家进出、踢出玩家、离开房间
- 属性管理:更新房间属性、玩家状态、玩家属性
- 数据同步:所有属性变更会通知房间内所有玩家
详细说明:请查看 房间管理,包含完整的创建、加入、管理流程和代码示例
# 第二步:游戏内消息通信
当玩家进入房间后,就可以通过消息传递实现游戏数据的同步。
# 实现流程
- 玩家进入房间 - 通过匹配或创建房间进入游戏
- 等待玩家准备 - 可选:通过
UpdatePlayerCustomStatus设置玩家准备状态 - 开始游戏 - 当所有玩家准备就绪,开始游戏
- 发送游戏消息 - 玩家执行操作时,使用
SendCustomMessage发送游戏数据 - 接收游戏消息 - 通过
OnCustomMessage事件接收其他玩家的操作 - 更新游戏状态 - 解析消息并更新本地游戏画面
- 游戏结束 - 调用
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- 停止帧同步
# 四、开发建议
# 消息频率控制
- 限制:
SendCustomMessage与UpdateRoomProperties共享每秒 15 次的调用限制 - 建议:合理控制发送频率,避免短时间内大量发送消息
- 优化:对于高频操作,可以考虑合并多个操作后再发送
# 消息结构设计
推荐使用清晰的消息结构:
public class GameMessage
{
public string type; // 消息类型(如 "move", "attack", "play_card")
public object data; // 具体操作数据
public long timestamp; // 时间戳(可选)
}
