【问题标题】:Issue with score in game with unity c#unity c# 游戏中的分数问题
【发布时间】:2021-01-08 20:03:58
【问题描述】:

在我的游戏中,玩家必须收集硬币。问题是当玩家死亡并开始新游戏时,硬币数量不会重置。例如:

开始新游戏并收集 15 个硬币,然后死亡

开始新游戏并将硬币数量设置为 15,而不是 0

我该如何解决这个问题??

用于在屏幕上显示乐谱的脚本:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class Score : MonoBehaviour
{
    Coin coin;
    void Update()
    {
        coin = FindObjectOfType<Coin>();
        GetComponent<Text>().text = coin.GetScore().ToString();
    }

用于添加硬币得分的脚本:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Coin : MonoBehaviour
{
    float speed = 10f;
    public static int score = 0;
    void Update()
    {
        transform.position += Vector3.left * speed * Time.deltaTime;
    }
    private void OnTriggerEnter2D(Collider2D collision)
    {
        score += 1;
    }
    public int GetScore()
    {
        return score;
    }
}

我还需要说,我在使用 PlayerPrefs 时使用该分数来制作一些高分概念,但我删除了我所做的每个 PlayerPrefs。非常感谢。

【问题讨论】:

  • 请阅读How to Ask 并确保您的标题正确涵盖了您的问题。 “分数问题”不清楚。

标签: c# unity3d


【解决方案1】:

这是有问题的行:

public static int score = 0;

声明为“静态”的变量将持续与运行时一样长,即使它所绑定的对象已被销毁(它是 所有 硬币对象共享的值)。

理想情况下,您应该让它成为非静态的(这是 Unity 所期望的)。

public int score = 0;

如果您在玩家死亡时重新创建 Coin 对象,unity 将为您处理清理工作。

或者,您可以向 Coin 类添加“重置”方法...

public int GetScore()
{
    return score;
}

public void Reset()
{
    score = 0;
}

answered a question 更详细地介绍了静态,可能会引起人们的兴趣。

通常当一个类有变量时,每次创建该类的新实例时,它都会获得每个变量的自己的副本。

(您可以创建两个Animal 类并为每个类分配不同的Name

static 变量不同。它们不是每个实例都有自己的变量副本,而是共享同一个。

因此,如果您设置animal1.StaticName,您也会更改animal2.StaticName。更重要的是,你甚至不需要制作动物,你可以直接设置Animal.StaticName

所以...即使您尚未创建类的实例,也可以读取/设置静态变量(并且可以执行静态方法)。

哦,而且...如果您确实决定保持分数不变,则无需找到特定对象即可获得分数...

void Update()
{
    GetComponent<Text>().text = Coin.score.ToString();
}

【讨论】:

  • 我使用了静态,因为我有多个硬币对象(它们正在实例化)
  • 当我将分数设置为非静态时,每次玩家收集硬币时,它都会上升到 1,然后再次下降到 0
  • 那么每个硬币都负责跟踪自己的分数吗?为什么不给玩家一个“分数”属性,每次他们接触硬币时都会增加 1?然后一个新玩家来了一个新的分数0。如果做不到这一点,如果您想保留当前设计,请按照演示实现 Reset() 方法并在您的玩家死亡时调用它
  • 但是您的代码目前正在采取一种非常冗长的方法...找到场景中的所有硬币,随机选择一个,然后询问共享硬币的总数是多少。每一帧。通过在Coin 上将score 设为静态,您是在说“分数是适用于所有硬币的属性”,这真的 不正确。
  • 是的,你说得对,我确实如你所说 - 重构代码并将 score 作为播放器属性,谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-01-01
  • 2015-03-16
  • 2020-01-06
  • 2019-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多