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

Unity中Doodle Jump复刻:仅首个平台触发加分的问题排查

解决Unity Doodle Jump平台仅首次加分的问题

嘿,我帮你排查下这个问题!你现在遇到的情况核心原因是每个平台脚本都维护了独立的currentScore变量,没有全局统一管理分数状态,而且缺少碰撞对象的校验和平台触发状态的标记,导致后续平台无法正确触发加分逻辑。下面是具体的解决方案:

问题分析

  1. 你当前的PlatformScript中,每个平台都有自己的currentScore和displayScore,踩第一个平台时修改的是这个平台的分数,后续平台的分数还是初始值0,就算加分也不会同步到全局UI上;
  2. 没有限制碰撞对象,可能误触发非玩家的碰撞;
  3. 没有标记平台是否已加分,可能出现重复加分(不过你的情况是后续无反应,主要还是分数管理的问题)。

解决方案:全局分数管理器+平台触发逻辑优化

第一步:创建全局GameManager管理分数

创建一个单例模式的GameManager,统一处理分数计算和UI显示,确保所有平台都共享同一个分数状态:

using UnityEngine;
using UnityEngine.UI;

public class GameManager : MonoBehaviour
{
    // 单例实例,方便其他脚本直接调用
    public static GameManager Instance;

    public int currentScore = 0;
    public Text displayScore; // 拖入你的分数UI文本

    void Awake()
    {
        // 确保场景中只有一个GameManager实例
        if (Instance == null)
            Instance = this;
        else
            Destroy(gameObject);
    }

    // 对外提供的加分方法
    public void AddScore(int amount)
    {
        currentScore += amount;
        UpdateScoreUI();
    }

    // 更新分数UI显示
    private void UpdateScoreUI()
    {
        if (displayScore != null)
            displayScore.text = $"Score: {currentScore}";
    }
}

第二步:修改PlatformScript的触发逻辑

让平台只负责检测玩家碰撞,然后通知GameManager加分,同时标记平台已触发,避免重复加分:

using UnityEngine;

public class PlatformScript : MonoBehaviour
{
    public float jumpForce = 10f;
    private bool hasTriggeredScore = false; // 标记该平台是否已加分

    void OnCollisionEnter2D(Collision2D collision)
    {
        // 只响应玩家对象的碰撞(记得给你的玩家对象设置"Player"标签)
        if (collision.gameObject.CompareTag("Player") && !hasTriggeredScore)
        {
            // 给玩家施加跳跃力(重置y轴速度避免叠加)
            Rigidbody2D playerRb = collision.gameObject.GetComponent<Rigidbody2D>();
            if (playerRb != null)
            {
                playerRb.velocity = new Vector2(playerRb.velocity.x, 0);
                playerRb.AddForce(Vector2.up * jumpForce, ForceMode2D.Impulse);
            }

            // 通知GameManager加分
            GameManager.Instance.AddScore(10);
            // 标记该平台已加分,防止重复触发
            hasTriggeredScore = true;
        }
    }
}

第三步:场景设置

  1. 在场景中创建一个空对象,命名为GameManager,把上面的GameManager脚本挂载上去;
  2. 在Inspector面板中,将你的分数UI文本拖到GameManager的displayScore字段;
  3. 给你的玩家对象设置Player标签(在Inspector的Tag下拉框中选择或创建Player标签);
  4. 移除所有平台脚本中的currentScore和displayScore字段(现在不需要了),确保所有平台都挂载修改后的PlatformScript。

这样修改后,所有平台都会共享同一个全局分数,每次踩未触发过的平台都会正确累加10分,UI也会同步更新啦!

内容的提问来源于stack exchange,提问作者Rachel Fitz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 07:59:08