You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity Mirror Network中玩家碰撞触发伤害失败:CmdApplyDamage未调用求助

问题原因与解决方案

核心问题:Command调用权限不符合Mirror规则

Mirror中,[Command]方法只能由该网络对象的本地客户端调用——你现在是用触发碰撞的本地玩家客户端,直接调用另一个玩家对象的CmdApplyDamage(),这违反了网络权限限制,所以方法不会被执行。

修正方案:

  1. 调整触发逻辑,调用本地玩家自身的Command
    不要直接操作其他玩家的方法,而是通过本地玩家的Command把被碰撞对象的网络身份传递给服务器,由服务器处理伤害:

    private void OnTriggerEnter(Collider other)
    {
        if (!isLocalPlayer) return;
    
        if (other.TryGetComponent<Player>(out var hitPlayer))
        {
            CmdDealDamageToTarget(hitPlayer.netIdentity);
        }
    }
    
  2. 在服务器端执行伤害操作
    新增一个Command方法,让服务器去修改被碰撞玩家的血量(服务器拥有所有网络对象的操作权限):

    [Command]
    public void CmdDealDamageToTarget(NetworkIdentity targetIdentity)
    {
        if (targetIdentity.TryGetComponent<Player>(out var targetPlayer))
        {
            targetPlayer.healthPoints--;
            // 若需要将血量同步到所有客户端,给healthPoints添加[SyncVar]标记
        }
    }
    
  3. 关键配置检查

    • 确保healthPoints字段标记[SyncVar],服务器修改后才能同步到所有客户端:
      [SyncVar]
      public int healthPoints;
      
    • 确认所有吸血鬼预制体都挂载了NetworkIdentity组件,且已正确注册到Mirror网络系统
    • 检查碰撞体是否勾选Is Trigger,且至少有一个碰撞对象带有Rigidbody组件(Mirror网络对象通常需要)

内容的提问来源于stack exchange,提问作者almaz akylbekov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 06:15:32