Unity中defaultScale变量在BackToOriginalSize函数中访问异常排查
问题分析与解决方案
核心原因
大概率是调用BackToOriginalSize的脚本实例,和调用increaseSize的不是同一个游戏对象。比如你在多个对象上挂载了该脚本,其中某个实例的Start方法未执行(或执行时this.transform.localScale.x本身为0),但你误调用了这个实例的方法,导致打印出0。
另外也可能是脚本所在对象的激活时机问题:如果对象初始处于禁用状态,Start方法不会执行,直到对象被激活,但Start仅执行一次,若激活时未正确初始化defaultScale,值会保持默认的0。
排查与解决步骤
验证实例一致性
在Start和BackToOriginalSize中添加打印,确认是否为同一个对象:public void Start() { defaultScale = this.transform.localScale.x; // 此处(float)可省略,localScale.x本身就是float类型 Debug.Log("初始化实例:" + this.gameObject.name + ",defaultScale:" + defaultScale); } public void BackToOriginalSize() { Debug.Log("调用实例:" + this.gameObject.name + ",defaultScale:" + defaultScale); // 原有代码... }如果两次打印的对象名称不一致,说明你调用了错误的实例,需要修正调用逻辑,确保操作的是同一个挂载该脚本的对象。
调整初始化时机
如果是对象激活时机导致Start未执行,把初始化逻辑移到Awake方法(Awake在对象加载时就执行,无论是否激活):private float defaultScale; public void Awake() { defaultScale = this.transform.localScale.x; }若需要每次对象启用时都重置默认值,可在
OnEnable中初始化:private void OnEnable() { defaultScale = this.transform.localScale.x; }优化对象查找逻辑
代码中每次调用都用GameObject.FindGameObjectsWithTag("medical")[0]查找对象,效率低且易出错(比如标签对象顺序变化)。建议在Awake或Start中缓存该对象:private GameObject medicalObj; private float defaultScale; public void Awake() { defaultScale = this.transform.localScale.x; medicalObj = GameObject.FindGameObjectWithTag("medical"); // 直接取单个标签对象,更高效 }后续函数直接使用
medicalObj即可,避免重复查找。
内容的提问来源于stack exchange,提问作者yixjia
相关产品推荐
相关产品推荐

