欢迎光临散文网 会员登陆 & 注册

6.Unity-Mirror帧同步攻击思路

2022-09-03 08:54 作者:机智的小草yns  | 我要投稿

最近用mirror写了联网demo,分享下个人的做法思路

不知道什么是Mirror的,见前期介绍


一次攻击事件的流程:

  1. 本地玩家A攻击玩家B。本地玩家A先向服务器发送攻击事件(A,B)

  2. 服务器接收后,计算数值最终伤害结果,扣除玩家B的体力,并转发给所有客户端。

  3. 服务器向所有的玩家A转发本地攻击事件(A,B)

  4. 所有的玩家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);

  //击飞敌人...

  //击中特效...
	
  //伤害数字...
}


6.Unity-Mirror帧同步攻击思路的评论 (共 条)

分享到微博请遵守国家法律