Unity 2D跑酷游戏分数改为整数递增的实现方法求助
解决Unity 2D跑酷游戏整数分数递增问题
报错原因
编译器报错CS0266是因为Time.deltaTime * 4是浮点型数值,整数类型无法隐式接收浮点值,直接强制转换会丢失小数部分,无法实现“累计到阈值后整数分数加1”的需求。
解决方案:双变量累计法
用一个整数变量存储实际显示的分数,另一个浮点变量累计时间增量,当累计值达到1时,整数分数加1,同时保留剩余的小数部分继续累计。修改后的代码如下:
using UnityEngine; using UnityEngine.UI; public class PlayerScript : MonoBehaviour { int currentScore; // 整数类型的实际分数 float scoreAccumulator; // 累计时间增量的浮点变量 bool IsAlive = true; public Text ScoreTxt; private void OnCollisionEnter2D(Collision2D collision) { if(collision.gameObject.CompareTag("ground")) { if(IsAlive) { scoreAccumulator += Time.deltaTime * 4; // 处理累计值超过1的情况,确保分数正确递增 while(scoreAccumulator >= 1f) { currentScore++; scoreAccumulator -= 1f; } ScoreTxt.text = $"Score: {currentScore}"; } } if(collision.gameObject.CompareTag("obstacle")) { IsAlive = false; Time.timeScale = 0; } } }
逻辑说明
scoreAccumulator持续累加时间增量,当数值≥1时,给currentScore加1,同时从累加器中扣除1,剩余小数部分继续累计。使用while循环是为了处理单次累加超过1的情况(比如某次直接加了1.8,此时分数会加1,累加器剩余0.8)。- 显示分数时直接使用整数
currentScore,实现每次递增1的效果。
备选方案:直接取整(不推荐)
如果你只是想把浮点分数转为整数显示,而非严格的“每次递增1”,可以用Mathf.FloorToInt直接转换,但这种方式会丢弃小数部分,分数增长逻辑和原逻辑一致只是显示整数:
using UnityEngine; using UnityEngine.UI; public class PlayerScript : MonoBehaviour { float score; bool IsAlive = true; public Text ScoreTxt; private void OnCollisionEnter2D(Collision2D collision) { if(collision.gameObject.CompareTag("ground")) { if(IsAlive) { score += Time.deltaTime * 4; ScoreTxt.text = $"Score: {Mathf.FloorToInt(score)}"; } } if(collision.gameObject.CompareTag("obstacle")) { IsAlive = false; Time.timeScale = 0; } } }
但这种方式无法实现“每次递增1”的精确触发,更推荐第一种双变量累计的实现方式。
内容的提问来源于stack exchange,提问作者R1vel
相关产品推荐
相关产品推荐

