6.Unity-Mirror幀同步攻擊思路
2022-09-03 08:54 作者:機(jī)智的小草yns | 我要投稿
最近用mirror寫了聯(lián)網(wǎng)demo,分享下個人的做法思路
不知道什么是Mirror的,見前期介紹

一次攻擊事件的流程:
當(dāng)本地玩家A攻擊玩家B。本地玩家A先向服務(wù)器發(fā)送攻擊事件(A,B)
服務(wù)器接收后,計(jì)算數(shù)值最終傷害結(jié)果,扣除玩家B的體力,并轉(zhuǎn)發(fā)給所有客戶端。
服務(wù)器向所有的玩家A轉(zhuǎn)發(fā)本地攻擊事件(A,B)
所有的玩家A通知所有玩家B受到攻擊,玩家B播放受擊動畫。

在A玩家的攻擊中,只有本地玩家A才有發(fā)出攻擊的權(quán)限。
而遠(yuǎn)端玩家A只是接收服務(wù)器命令播放動畫而已,遠(yuǎn)端玩家在世界中發(fā)出是技能都不會觸發(fā)任何事件。

攻擊事件示例代碼:(部分參數(shù)省略)
//傷害觸發(fā)
public override void OnAckTrigger(Collider other, AckInfoObject triggerInfo)
{
?//受擊對象
?var damager = other.GetComponent<MonoAttacker>();
?if (damager != null)
?{
? ?//利用 本地玩家轉(zhuǎn)發(fā)信息
? ?PlayerManager.Instance.LocalPlayer.CmdOnDam(damager.netId, triggerInfo.ackInfo);
?}
}
[Command]
public void CmdOnDam(uint DamagerNetId, AckInfo ackInfo)
{
?//數(shù)據(jù)層在服務(wù)器中執(zhí)行
?//獲取受擊者
?var OnDamager = PlayerManager.Instance.GetPlayer(DamagerNetId);
?//隨機(jī)波動
?RandomAck = Random.Range(0.95f, 1.05f);
?//傷害數(shù)值
?float DamageValue = OnDamager.Ack * setting.AckRate * RandomAck;
?//結(jié)算最終血量
?int targetHp = Math.Max(Mathf.RoundToInt(OnDamager.playerData.hp - DamageValue), 0);
?//用于傷害數(shù)字顯示
?ackInfo.ackValue = DamageValue;
?//修改playerData
?var newData = OnDamager.playerData;
?newData.hp = targetHp;
?OnDamager.playerData = newData;
?//執(zhí)行表現(xiàn)層
?RcpOnDam(DamagerNetId, ackInfo);
}
[ClientRpc]
public void RcpOnDam(uint DamagerNetId, AckInfo ackInfo)
{
?//通過netId獲取受擊方 執(zhí)行受擊表現(xiàn)
?IAttacker onDamgerer = PlayerManager.Instance.GetPlayer(DamagerNetId);
?onDamgerer.OnDam(ackInfo);
}
public override void OnDam(AckInfo ackInfo)
{
?//受擊中動畫
?playerMover.PlayAnim(AnimHash.damageAnim01);
?//擊飛敵人...
?//擊中特效...
?//傷害數(shù)字...
}

標(biāo)簽: