Unity中int相除赋值float无小数输出问题求助
Unity整数除法导致浮点数计算错误问题解决
问题描述
在Unity项目中,两段脚本分别实现角色血量管理和血条UI显示逻辑:
Health脚本负责维护角色的血量数值HealthStatusBar脚本负责根据血量更新血条显示
在HealthStatusBar的Update方法中执行float fillValue = health.currentHealth/health.maxHealth;时,当currentHealth不等于maxHealth(例如90/100),fillValue的输出结果始终为0,但已确认currentHealth的数值变化是正常的。
相关代码
Health脚本
public class Health : MonoBehaviour { public int maxHealth = 100; public int currentHealth; // Start is called before the first frame update void Start() { currentHealth = maxHealth; } }
HealthStatusBar脚本
public class HealthStatusBar : MonoBehaviour { public Health health; public Image fillImage; private Slider slider; private void Awake() { slider = GetComponent<Slider>(); } private void Update() { if (slider.value <= 0) { fillImage.enabled = false; }//turns off slider if dead float fillValue = health.currentHealth/health.maxHealth; Debug.Log(fillValue); if (fillValue < slider.maxValue / 3) { fillImage.color = Color.red; }//changes colour if low on health slider.value = fillValue; } }
问题原因
这是C#的整数除法特性导致的:health.currentHealth和health.maxHealth都是int(整数)类型,两个整数相除时,程序会直接舍弃小数部分取整,比如90/100的整数计算结果就是0,之后再赋值给float类型变量,结果依然是0。
解决方案
有三种简单的修复方式:
强制转换其中一个整数为float
让运算以浮点数规则执行,避免整数取整:float fillValue = (float)health.currentHealth / health.maxHealth;使用浮点数值参与运算
给其中一个数值添加.f后缀,将其转为浮点数:float fillValue = health.currentHealth / (float)health.maxHealth;将血量变量改为float类型(可选)
如果业务逻辑允许,直接在Health脚本中把血量定义为float类型,后续所有运算都会是浮点运算:public class Health : MonoBehaviour { public float maxHealth = 100f; public float currentHealth; void Start() { currentHealth = maxHealth; } }
内容的提问来源于stack exchange,提问作者Lyiam Mendoza
相关产品推荐
相关产品推荐

