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

Unity C# 2D游戏中如何通过GameObject坐标变化量计算得分

Unity 2D游戏坐标变化计分功能修复方案

问题根源

  1. 原有代码每帧直接将当前物体的X、Y坐标直接相加赋值给计分变量,没有计算坐标的变化量,也没有做累加操作,完全不符合按位移计分的需求。
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 21:27:03