Unity中如何禁用敌人友军误伤且不影响玩家攻击敌人?
问题解决方案
一、修复敌人激光误伤友军的问题
你之前的修改导致所有激光失效,核心原因是玩家发射的激光没有父物体,other.transform.parent为null,判断other.transform.parent.tag会直接报错,同时条件永远不成立,敌人自然不会响应任何激光。
正确的做法是利用你已经在Laser脚本中定义的_isEnemyLaser状态区分激光类型,步骤如下:
1. 调整Laser脚本,规范暴露激光状态
将私有状态通过公共属性开放,避免直接访问私有变量:
private float _speedLaser = 10.0f; private bool _isEnemyLaser = false; // 新增公共属性,供外部判断激光归属 public bool IsEnemyLaser => _isEnemyLaser; void Update() { if (!_isEnemyLaser) { MoveUp(); } else { MoveDown(); } } // 其余MoveUp、MoveDown、AssignEnemy代码保持不变
2. 修改Enemy脚本的碰撞检测逻辑
在敌人的OnTriggerEnter2D中,仅响应玩家发射的激光:
private void OnTriggerEnter2D(Collider2D other) { if (other.tag == "Player") { // 原玩家碰撞逻辑保持不变 Player player = other.transform.GetComponent<Player>(); if (player != null) { _uiManager.PenaltyScore(); player.Damage(); } Instantiate(_enemy_explosionPrefab, transform.position + new Vector3 (0, -0.51f, 0), Quaternion.identity); Destroy(this.gameObject); } if (other.tag == "Laser" && transform.position.y < 6.2f) { Laser laser = other.GetComponent<Laser>(); // 仅处理玩家发射的激光 if (laser != null && !laser.IsEnemyLaser) { Destroy(other.gameObject); _uiManager.UpdateScore(); Instantiate(_enemy_explosionPrefab, transform.position, Quaternion.identity); Destroy(this.gameObject); } } }
修改后,敌人只会被玩家激光击中,敌人自身发射的激光碰到友军时,因laser.IsEnemyLaser为true不会触发销毁逻辑,彻底解决误伤问题。
二、共用激光脚本 vs 单独脚本/预制体的选择
两种方案的优缺点:
共用一个脚本(当前方案)
- 优势:无代码冗余,激光的移动、边界销毁等通用逻辑只需维护一处,后续扩展(如添加音效、特效)时效率更高。
- 劣势:需要通过状态变量区分行为,逻辑复杂度略高,但你的代码已搭建好基础框架,调整成本极低。
单独脚本+预制体
- 优势:逻辑完全独立,无需判断状态,新手更容易理解维护,不易出现状态判断错误。
- 劣势:会产生重复代码(如移动、销毁逻辑),后续修改需同步更新两个脚本,增加维护成本。
建议
如果当前项目激光仅存在移动方向差异,共用脚本是更优选择,既避免冗余又能满足需求。若后续敌人激光需要添加独特行为(如穿透、爆炸、不同伤害),再拆分单独脚本也不迟。
内容的提问来源于stack exchange,提问作者Annie Alves
相关产品推荐
相关产品推荐

