Unity勾选Sphere Collider的Is Trigger后火球/投射物无法飞行问题
你的猜想不成立,Unity的Trigger触发机制至今仍然是官方推荐的碰撞检测方案之一,不需要自行实现触发逻辑,你遇到的问题是配置和代码缺陷共同导致的:
问题原因
勾选Is Trigger后火球卡在生成位置,本质是火球刚生成就和敌人自身的碰撞器触发了销毁逻辑:
你当前的Fireball脚本中,OnTriggerEnter方法只要触发就会执行Destroy(this.gameObject),没有排除敌人自身的碰撞器,火球生成时和敌人碰撞体重叠,刚生成就被销毁,视觉上就表现为卡在原地没有飞出去。
解决方案
1. 修复火球触发逻辑
修改Fireball.cs的OnTriggerEnter方法,只在碰到玩家/障碍物时销毁,忽略敌人自身碰撞:
void OnTriggerEnter(Collider other) { // 碰到玩家造成伤害后销毁 PlayerCharacter player = other.GetComponent<PlayerCharacter>(); if (player != null) { player.Hurt(damage); Destroy(this.gameObject); return; } // 碰到障碍物销毁 if (other.CompareTag("Obstacle")) { Destroy(this.gameObject); return; } // 碰到敌人自身直接跳过,不做处理 if (other.CompareTag("Enemy")) { return; } }
注意提前在Unity编辑器中给敌人对象设置
Enemy标签,给场景中的墙面、地面等障碍物设置Obstacle标签。
2. 完善火球预制体配置
给火球预制体添加Rigidbody组件,按以下参数设置:
- 取消勾选Use Gravity,避免火球受重力影响下坠
- 勾选Is Kinematic,避免火球受物理外力影响出现偏移、反弹等不符合预期的效果
- 碰撞检测模式选择Continuous Dynamic,避免高速移动的火球出现穿模问题
3. 调整火球生成位置
修改WanderingAI.cs中生成火球的位置参数,避免生成时和敌人体积重叠:
将transform.TransformPoint(Vector3.forward * 1.5f)中的1.5f调整为2f或更大的数值,匹配你敌人模型的体积即可。
不用Trigger的替代方案(可选)
如果确实不想勾选Is Trigger,可以改用碰撞检测实现,按以下步骤调整:
- 取消Sphere Collider的
Is Trigger勾选 - 火球的
Rigidbody组件取消Is Kinematic勾选,保持Use Gravity关闭 - 将
Fireball.cs的OnTriggerEnter替换为OnCollisionEnter:
void OnCollisionEnter(Collision collision) { PlayerCharacter player = collision.collider.GetComponent<PlayerCharacter>(); if (player != null) { player.Hurt(damage); } Destroy(this.gameObject); }
内容的提问来源于stack exchange,提问作者JJJAAAVVVAAA
相关产品推荐
相关产品推荐

