多人游戏数据共享与独立(自己的塔防游戏为例)
精华修改于03/3031 浏览开发心得
制作多人游戏时务必要提前和塔拉拉沟通好哪些数据独立or共享.否则之后改的时候所花费的积分和时间代价是巨大的,以下是我的塔防游戏一些注意点,各位开发者可以作为参考
一、玩家独立数据(Per-Player)每个玩家拥有自己独立的一份,互不影响。
1.1 经济系统数据服务端位置同步方式
金币 gold
灵魂 souls
设计意图:每个玩家独立挣钱、独立花钱,不会互相抢资源。
1.2 人口系统数据服务端位置同步方式
人口上限 popCap
已用人口 popUsed
设计意图:每个玩家有自己的人口上限,放自己的塔消耗自己的人口。
1.3 卡牌/手牌数据服务端位置同步方式
手牌 hand
保底计数 gachaPity
内部状态
设计意图:每个玩家独立抽卡、独立出牌。
1.4 背包/装备数据服务端位置同步方式
背包 backpack
已装备 equippedUids
内部状态
设计意图:装备归属于塔的所有者,出售塔时装备返还给塔的 ownerId。
1.5 等级/经验数据服务端位置同步方式
玩家等级 playerLevel
经验值 playerExp
1.6 塔归属数据服务端位置同步方式
塔所有者 ownerId
设计意图:每个塔记录是哪个玩家放置的。出售返还资源给 ownerId,羁绊按 ownerId 分别计算。
1.7 羁绊系统数据服务端位置同步方式
羁绊 tier 缓存
服务端内部,战斗时按塔 ownerId 查询
羁绊脏标记
服务端内部
设计意图:玩家 A 放了 2 个A羁绊,不会影响玩家 B。每个玩家只看到自己的羁绊激活状态。
1.8 怪物计数/超限数据服务端位置同步方式
场上怪物数
超限倒计时
设计意图:每个玩家的出怪口独立,怪物数超过 100 只扣该玩家的命。
已修复:
· 客户端 MonsterBar 只显示 (e.ownerPlayer or 1) == mySlot 的怪物
· 服务端超限检测按玩家独立,已死亡玩家跳过(防止无限循环倒计时)
1.9 生命/死亡数据服务端位置同步方式
玩家生命
gs.playerLives[pi]
BroadcastResourceSync
生命模式
gs.lifeMode = "independent"
固定配置
设计意图:独立生命模式下,某个玩家的怪物到达终点只扣该玩家的命,某个玩家死了不影响其他人。
二、全队共享数据所有玩家共用同一份,某个玩家的操作会影响全队。
2.1 地图/路径数据服务端位置同步方式
路径点 waypoints 初始化时同步
地图格子
设计意图:所有玩家在同一张地图上放塔,可以互相看到对方的塔。
2.2 敌人列表数据服务端位置同步方式
所有敌人
enemies[]
设计意图:虽然每个敌人有 ownerPlayer 标记归属哪个玩家的出怪口,但所有敌人在同一张地图上行走,所有玩家的塔都可以攻击任何敌人。
2.3 波次状态数据服务端位置同步方式
当前波次
波次倒计时
设计意图:所有玩家统一进入下一波,不能某个玩家单独跳波。
四、设计决策说明为什么羁绊要独立?
塔防中每个玩家独立组阵容,如果羁绊共享,玩家 A 放的英雄会影响玩家 B 的羁绊激活,破坏独立策略性。
为什么 teamBuffs 要独立?
“全队"指的是本玩家的所有塔。当玩家 A 的英雄释放"某增益”,只应该增强玩家 A 自己的塔。如果共享,玩家 A 的技能会无偿增强玩家 B/C/D 的塔,破坏独立策略性。
为什么敌人列表要共享?所有敌人在同一张地图上,任何玩家的塔都可以攻击任何敌人。但每个敌人通过 ownerPlayer 标记归属,决定了到达终点扣谁的命、计入谁的怪物计数。



