Unity中从其他GameObject调用GetComponent功能失效问题求助
问题根因
代码的核心错误为变量遮蔽问题:Awake方法中声明了一个和类成员变量同名的局部ScoreManager变量,GetComponent的返回值被赋值给了这个作用域仅在Awake方法内的临时变量,方法执行结束后临时变量会被回收,类的全局ScoreManager成员始终为null,因此触发器触发时的判空逻辑不通过,加分代码不会运行。
修复后代码
using System.Collections; using System.Collections.Generic; using UnityEngine; public class OnTrigger : MonoBehaviour{ [SerializeField] private GameObject ScoreManagerObject; private ScoreManager ScoreManager; private void Awake() { if (ScoreManagerObject != null){ // 移除局部变量的类型声明,直接给类成员变量赋值 ScoreManager = ScoreManagerObject.GetComponent<ScoreManager>(); // 新增组件不存在的报错日志,方便后续排查 if(ScoreManager == null){ Debug.LogError("指定的ScoreManagerObject对象上未找到ScoreManager组件", this); } } else{ Debug.LogError("请在Inspector面板为ScoreManagerObject字段赋值对应对象", this); } } private void OnTriggerEnter(Collider other) { if (ScoreManager != null){ ScoreManager.score += 1; Debug.Log("score " + ScoreManager.score ); } } }
额外排查项
- 确认Inspector面板中已经将挂载了
ScoreManager脚本的游戏对象拖入ScoreManagerObject字段 - 确认
ScoreManager脚本中的score变量为public权限,否则会触发访问权限报错 - 确认
ScoreManagerObject对象上确实挂载了ScoreManager脚本,脚本名称拼写无错误
内容的提问来源于stack exchange,提问作者RudkoJ
相关产品推荐
相关产品推荐

