Unity RPG开发:运行时属性显示异常(Debug日志正常)
Unity RPG属性显示0但Debug.Log正确的问题排查与解决
核心原因:脚本执行顺序不匹配
你的问题大概率是**StatisticsViewer的Start()方法比VitalityConverter的Start()先执行**。当StatisticsViewer读取CurrentHP时,VitalityConverter还没完成HP计算,所以显示0;而VitalityConverter的Debug.Log是在自己的Start()里执行,此时计算已经完成,所以输出正确值。
解决方案
1. 强制控制脚本执行顺序
- 打开Unity编辑器,进入
Edit > Project Settings > Script Execution Order - 将
VitalityConverter的执行优先级调至StatisticsViewer之前(数值越小,执行越早,默认是0,给VitalityConverter设为-10即可)
2. 读取前主动触发计算(更稳妥)
不需要依赖执行顺序,在StatisticsViewer读取HP前,先调用计算方法确保值已更新:
void Start() { vitalityConverter = FindObjectOfType<VitalityConverter>(); if (vitalityConverter != null) { // 先执行HP计算,再读取结果 vitalityConverter.VitalityMathConversion(); HP.text = vitalityConverter.HealthValue().ToString(); } else { Debug.Log("VitalityConverter missing!"); } STR.text = Statistics.initialSTR.ToString(); VIT.text = Statistics.initialVIT.ToString(); Int.text = Statistics.initialInt.ToString(); Dex.text = Statistics.initialDex.ToString(); Spd.text = Statistics.initialSpd.ToString(); }
3. 把计算逻辑移到Awake方法
Awake()的执行时机早于Start(),将VitalityConverter的计算逻辑移到Awake()里,确保在所有Start()执行前完成HP计算:
public class VitalityConverter : MonoBehaviour { public PlayerStatistics CurrentStats; public int CurrentHP; private int ConversionRate = 5; void Awake() // 替换原来的Start { VitalityMathConversion(); int healthValue = HealthValue(); Debug.Log("Total Health is " + healthValue); } public void VitalityMathConversion() { CurrentHP = (CurrentStats.initialVIT + CurrentStats.CurrentVit) * ConversionRate; } public int HealthValue() { return CurrentHP; } }
额外检查点
确认StatisticsViewer中的Statistics引用,和VitalityConverter中的CurrentStats引用是同一个PlayerStatistics实例,避免因引用不一致导致数值读取错误。
内容的提问来源于stack exchange,提问作者RGVC
相关产品推荐
相关产品推荐

