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

Unity 2D问题:通过OnTriggerEnter2D触发父物体动画失败

Unity 2D 动画触发失败排查方案

问题场景

我正在制作Unity 2D游戏,航母对象的触发器能正常触发OnTriggerEnter2D(日志可正常打印),调用Player的LandJet方法后,却无法触发挂载在Player父物体上的Animator动画。尝试过使用SetBool/SetTrigger、调整触发器设置、更换触发物体等操作,均无效果。

相关代码与配置:

  • 航母脚本:
public class AirCraftCarrier : MonoBehaviour
{
    Player player;
    MoveLevel moveLevel;

    void Start()
    {
        player = FindObjectOfType<Player>();
        //moveLevel = FindObjectOfType<MoveLevel>();
    }

    void OnTriggerEnter2D(Collider2D other)
    {
        Debug.Log("Collision");
        player.LandJet();
    }
}
  • Player脚本核心逻辑:
public Animator animator;

void Awake()
{
    animator = GetComponentInParent<Animator>();
}

public void LandJet()
{
    animator.SetBool("LandShip", true);
    //animator.SetTrigger("LandShip");
}

排查与解决步骤

1. 校验Animator参数与过渡配置

  • 打开Animator窗口,确认存在完全同名且类型匹配的参数:用SetBool就对应Bool类型的LandShip,用SetTrigger就对应Trigger类型,注意大小写敏感。
  • 检查动画过渡条件:从当前状态到着陆动画的过渡,需正确绑定参数(比如Bool值为true、Trigger被触发),同时关闭过渡的Has Exit Time选项(若需立即触发动画,该选项会导致等待当前动画结束才切换)。

2. 确认Animator引用有效性

在LandJet方法中添加空引用校验日志,排查是否未正确获取组件:

public void LandJet()
{
    if(animator == null)
    {
        Debug.LogError("Animator引用为空!");
        return;
    }
    Debug.Log("设置动画参数:LandShip = true");
    animator.SetBool("LandShip", true);
}

若打印空引用错误:

  • 检查Player子物体的父物体层级,确认父物体确实挂载了Animator组件;
  • 可直接在Inspector面板手动拖拽Animator组件到Player脚本的animator字段,替代动态查找逻辑。

3. 测试动画状态机逻辑

  • 在场景运行时,直接在Inspector面板修改Animator的参数值,若手动修改能触发动画,说明代码调用逻辑存在问题;若手动修改也无效,需检查状态机的过渡优先级、默认状态是否覆盖了着陆动画。

4. 二次确认碰撞交互配置

  • 确保Player对象拥有2D碰撞器(无需设为触发器,只要与航母的触发器碰撞器处于同一交互层级);
  • 检查Edit > Project Settings > Physics 2D中的Layer Collision Matrix,确认Player与航母所在层级允许碰撞交互。

内容的提问来源于stack exchange,提问作者Myerpheus

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 05:17:16