Unity技术问题:子弹伤害变量值异常及FormatException崩溃排查
问题根源
- 初始值未正确赋值:
Start()会在物体第一帧更新前执行,但如果IncreaseDamage()在Start()之前被调用(比如实例化后立即调用、或者在Awake()里调用),_currentDamage还没被赋值为_damage的初始值1,会保持float类型的默认值0。 - 格式化导致空字符串:当
damageLong为0时,#.##格式会输出空字符串——#是可选数字占位符,不会显示无意义的0,0的整数和小数部分都没有有效数字,所以结果为空。 - 空字符串解析崩溃:
float.Parse("")直接触发FormatException,因为空字符串无法转换为浮点数。
解决办法
最优方案:移除多余的字符串转换
完全没必要把计算后的伤害值转成字符串再解析回来,直接赋值即可,代码更高效且避免错误:
public void IncreaseDamage(float damageMultiplier) { _currentDamage *= damageMultiplier; Debug.Log($"当前伤害:{_currentDamage}"); }
修复初始化时机
确保_currentDamage在IncreaseDamage()调用前完成初始化,可将赋值逻辑移到Awake()(比Start()更早执行):
private void Awake() { _currentDamage = _damage; }
如果确实需要格式化(仅用于显示场景)
要是必须格式化数值(比如日志展示),用"F2"格式强制保留两位小数,0会显示为"0.00",不会出现空字符串:
public void IncreaseDamage(float damageMultiplier) { _currentDamage *= damageMultiplier; string formattedDamage = _currentDamage.ToString("F2"); Debug.Log($"当前伤害:{formattedDamage}"); }
额外注意点
- 检查
IncreaseDamage()的调用时机,必须在Start()或Awake()之后执行,避免使用未初始化的_currentDamage。 - 非必要情况下不要将数值类型转成字符串再转回数值,既会损耗性能又容易引发转换错误,除非有明确的业务需求(比如保存到配置文件、前端显示)。
内容的提问来源于stack exchange,提问作者user21403547
相关产品推荐
相关产品推荐

