Unity C# 2D游戏中如何通过GameObject坐标变化量计算得分
Unity 2D游戏坐标变化计分功能修复方案
问题根源
- 原有代码每帧直接将当前物体的X、Y坐标直接相加赋值给计分变量,没有计算坐标的变化量,也没有做累加操作,完全不符合按位移计分的需求。
- Unity崩溃大概率是Inspector面板中
score等public变量未挂载对应组件,持续抛出空引用异常导致程序卡死。
修正后完整代码
using UnityEngine; using UnityEngine.UI; public class ScoreEasy : MonoBehaviour { public float timeScore = 1; public Text score; // 不需要用到的Rigidbody2D变量可以直接删除 public Rigidbody2D rb; // 存储上一帧的坐标 private float lastPosX; private float lastPosY; // 计分放大系数,1单位位移对应10分 private const int ScoreMultiplier = 10; void Start() { // 初始化上一帧坐标为游戏启动时的初始坐标 lastPosX = transform.position.x; lastPosY = transform.position.y; } void Update() { // 计算当前帧和上一帧的坐标变化量,取绝对值避免位移方向影响计分 float deltaX = Mathf.Abs(transform.position.x - lastPosX); float deltaY = Mathf.Abs(transform.position.y - lastPosY); // 总位移量 float totalDelta = deltaX + deltaY; // 按需求累加计分:如果需要和示例一致(0.8单位位移加10分),使用向上取整 timeScore += Mathf.CeilToInt(totalDelta) * ScoreMultiplier; // 更新上一帧坐标为当前坐标,供下一帧计算使用 lastPosX = transform.position.x; lastPosY = transform.position.y; // 输出整数得分 score.text = Mathf.RoundToInt(timeScore).ToString(); } }
功能适配说明
- 如果仅需要统计Y轴下降的得分(和你举的示例场景一致),将
totalDelta的计算逻辑替换为:// 只有Y坐标下降时才会计算变化量,上升不计分 float totalDelta = Mathf.Max(0, lastPosY - transform.position.y); - 如果不需要向上取整,希望0.8单位位移加8分,将累加逻辑替换为:
timeScore += totalDelta * ScoreMultiplier; - 脚本挂载后,需要在Inspector面板中将你的计分UI Text组件拖入
score变量的插槽中,避免空引用报错。
内容的提问来源于stack exchange,提问作者ZOMBYSPIDER
相关产品推荐
相关产品推荐

