Unity Mirror客户端无法执行伤害Command 仅主机端正常问题求助
问题根因
- 标记
[Command]特性的函数执行逻辑为客户端发起调用、服务端实际运行,你在客户端本地点击敌人后给enemy字段赋值的操作仅存在于客户端本地,没有同步到服务端对应的玩家实例上,因此服务端侧的enemy始终为null,伤害逻辑自然无法触发。 - 移除
enemy != null校验后,服务端执行CmdDamage时会触发空引用异常,直接触发连接断开逻辑。
修复方案
- 修改
CmdDamage函数,将目标敌人作为参数传递:
继承自NetworkBehaviour的类型可以直接作为Command的参数传递,引擎会自动处理网络对象的映射,无需手动传递对象ID。
[Command] private void CmdDamage(EnemyScript targetEnemy) { if(targetEnemy != null) targetEnemy.TakeDamage(5); }
- 修改
BasicAttack方法,调用时传入本地选中的敌人:
额外加一层本地非空判断,避免未选中敌人时触发空报错。
private void BasicAttack() { if(enemy == null) return; float dist = Vector3.Distance(enemy.transform.position, transform.position); if(dist < 2.5f) { GetComponent<NetworkAnimator>().SetTrigger(Animator.StringToHash("sword slash")); CmdDamage(enemy); timer = timerMax; } }
额外优化建议
你当前选中敌人后直接调用enemy.target.SetActive(true)仅会在本地显示选中标记,如果需要所有客户端都能看到选中状态,建议在EnemyScript中新增[ServerRpc]标记的同步方法来控制target的显隐,避免多端状态不一致。
内容的提问来源于stack exchange,提问作者madeer
相关产品推荐
相关产品推荐

