You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity技术问题:子弹伤害变量值异常及FormatException崩溃排查

问题根源
  1. 初始值未正确赋值:Start()会在物体第一帧更新前执行,但如果IncreaseDamage()在Start()之前被调用(比如实例化后立即调用、或者在Awake()里调用),_currentDamage还没被赋值为_damage的初始值1,会保持float类型的默认值0。
  2. 格式化导致空字符串:当damageLong为0时,#.##格式会输出空字符串——#是可选数字占位符,不会显示无意义的0,0的整数和小数部分都没有有效数字,所以结果为空。
  3. 空字符串解析崩溃: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 16:43:27