Unity中追击玩家的实例化敌人重叠问题求助
解决俯视RPG敌人追击玩家时重叠的问题
问题根源
所有敌人都直接朝着玩家坐标移动,完全不考虑彼此的存在;加上你用Rigidbody2D.MovePosition直接设置位置,不会触发物理引擎的碰撞推开逻辑,自然会挤成一团。另外你的OnTriggerExit2D里的等待逻辑是错误的,会直接卡死主线程,得先修复这个问题。
分步修复
1. 替换错误的等待逻辑
原来的while循环会阻塞游戏主线程,改成协程实现延迟停止追击:
private void OnTriggerExit2D(Collider2D collision) { if (chase) { StartCoroutine(StopChaseAfterDelay()); } } private IEnumerator StopChaseAfterDelay() { yield return new WaitForSeconds(1f); chase = false; }
2. 添加敌人互相避让逻辑
先给敌人的Rigidbody2D做基础设置:
- 重力设为0
- 碰撞检测模式改成
Continuous(防止高速移动穿模) - 勾选
Freeze Rotation Z(俯视视角不需要旋转)
然后修改FixedUpdate的移动逻辑,加入避开其他敌人的判断:
void FixedUpdate() { if (!GameManager.instance.battleActive && chase) { // 计算朝向玩家的基础方向 Vector2 dirToPlayer = (CameraController.instance.target.position - transform.position).normalized; // 计算避开其他敌人的方向 Vector2 avoidDir = Vector2.zero; // 检测当前敌人周围1单位内的其他敌人(记得给敌人单独建个Enemy层) Collider2D[] nearbyEnemies = Physics2D.OverlapCircleAll(transform.position, 1f, LayerMask.GetMask("Enemy")); foreach (var enemyCol in nearbyEnemies) { if (enemyCol.gameObject != gameObject) { // 计算远离其他敌人的方向 Vector2 away = (transform.position - enemyCol.transform.position).normalized; avoidDir += away; } } // 合并两个方向,0.8是避让权重,数值越大越优先避让 Vector2 finalDir = (dirToPlayer + avoidDir * 0.8f).normalized; // 用AddForce代替MovePosition,让物理引擎处理碰撞 m_Rigigbody.velocity = finalDir * speed; } else { // 不追击时停下 m_Rigigbody.velocity = Vector2.zero; } }
3. 调整碰撞体设置
- 实心胶囊碰撞体不要开
Is Trigger,让它成为物理碰撞体,这样敌人之间能被物理引擎推开 - 触发战斗的圆形碰撞体保持
Is Trigger勾选,专门用来检测玩家进入追击范围
额外优化建议
- 可以加个最小追击距离,当敌人离玩家小于某个值时停止移动,避免一直贴在玩家身上
- 调整避让权重的数值,根据你的游戏手感微调,找到最合适的平衡
内容的提问来源于stack exchange,提问作者Mike the Scripter
相关产品推荐
相关产品推荐

