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

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,可以改用碰撞检测实现,按以下步骤调整:

  1. 取消Sphere Collider的Is Trigger勾选
  2. 火球的Rigidbody组件取消Is Kinematic勾选,保持Use Gravity关闭
  3. 将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 20:30:00