Unity中调用anim.SetTrigger触发NullReferenceException且动画未执行的问题求助
解决Unity中
anim.SetTrigger触发NullReferenceException的问题 嘿,我一眼就发现问题根源啦!你遇到的NullReferenceException : Object reference not set to an instance of an object错误,本质是你的anim变量根本没被正确初始化,咱们一步步搞定它:
核心问题:生命周期方法大小写错误
Unity的生命周期方法对大小写要求非常严格,你写的是小写开头的awake(),但正确的方法名应该是大写A开头的Awake()!这就导致anim = GetComponent<Animator>()这行初始化代码完全没被执行,anim变量一直是null,调用anim.SetTrigger时自然就抛出空引用错误了。
把方法名修正后,初始化代码就能正常运行:
void Awake() { anim = GetComponent<Animator>(); }
额外的排查验证步骤(确保万无一失)
如果修正后还有问题,可以检查以下几点:
- 确认挂载这个脚本的GameObject上,确实添加了
Animator组件,没有的话手动在Inspector面板里添加。 - 核对Animator控制器中的触发器名称,必须和代码里的
"OnExplosion"完全一致(包括大小写、拼写,Unity字符串是区分大小写的)。 - 如果你的爆炸对象是通过对象池复用的,可以考虑在
OnEnable()或者StartExplosion()方法里重新获取一次Animator组件,避免对象复用导致的组件引用丢失。
修改后的完整脚本示例
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Explosion : MonoBehaviour { Animator anim; // 修正为大写开头的Awake方法 void Awake() { anim = GetComponent<Animator>(); } private void OnEnable() { Invoke("OnDisable", 2f); } private void OnDisable() { gameObject.SetActive(false); } public void StartExplosion(string target) { Debug.Log("startExplosion"); // 现在anim已经被正确初始化,不会再抛出空引用错误 anim.SetTrigger("OnExplosion"); Debug.Log("startExplosion2"); switch (target) { case "doge": transform.localScale = Vector3.one * 1.2f; break; case "dogelonmas": case "RocketA": case "RocketB": case "samo": case "shiba": case "jindoge": transform.localScale = Vector3.one; break; } Debug.Log("startExplosion3"); } }
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

