6.Unity-Mirror帧同步攻击思路
最近用mirror写了联网demo,分享下个人的做法思路
不知道什么是Mirror的,见前期介绍

一次攻击事件的流程:
当本地玩家A攻击玩家B。本地玩家A先向服务器发送攻击事件(A,B)
服务器接收后,计算数值最终伤害结果,扣除玩家B的体力,并转发给所有客户端。
服务器向所有的玩家A转发本地攻击事件(A,B)
所有的玩家A通知所有玩家B受到攻击,玩家B播放受击动画。

在A玩家的攻击中,只有本地玩家A才有发出攻击的权限。
而远端玩家A只是接收服务器命令播放动画而已,远端玩家在世界中发出是技能都不会触发任何事件。

攻击事件示例代码:(部分参数省略)
//伤害触发
public override void OnAckTrigger(Collider other, AckInfoObject triggerInfo)
{
//受击对象
var damager = other.GetComponent<MonoAttacker>();
if (damager != null)
{
//利用 本地玩家转发信息
PlayerManager.Instance.LocalPlayer.CmdOnDam(damager.netId, triggerInfo.ackInfo);
}
}
[Command]
public void CmdOnDam(uint DamagerNetId, AckInfo ackInfo)
{
//数据层在服务器中执行
//获取受击者
var OnDamager = PlayerManager.Instance.GetPlayer(DamagerNetId);
//随机波动
RandomAck = Random.Range(0.95f, 1.05f);
//伤害数值
float DamageValue = OnDamager.Ack * setting.AckRate * RandomAck;
//结算最终血量
int targetHp = Math.Max(Mathf.RoundToInt(OnDamager.playerData.hp - DamageValue), 0);
//用于伤害数字显示
ackInfo.ackValue = DamageValue;
//修改playerData
var newData = OnDamager.playerData;
newData.hp = targetHp;
OnDamager.playerData = newData;
//执行表现层
RcpOnDam(DamagerNetId, ackInfo);
}
[ClientRpc]
public void RcpOnDam(uint DamagerNetId, AckInfo ackInfo)
{
//通过netId获取受击方 执行受击表现
IAttacker onDamgerer = PlayerManager.Instance.GetPlayer(DamagerNetId);
onDamgerer.OnDam(ackInfo);
}
public override void OnDam(AckInfo ackInfo)
{
//受击中动画
playerMover.PlayAnim(AnimHash.damageAnim01);
//击飞敌人...
//击中特效...
//伤害数字...
}
