游戏中的分数问题与统一 c#

Kub*_*322 0 c# unity-game-engine

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

开始新游戏并收集 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();
    }
Run Code Online (Sandbox Code Playgroud)

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

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Bas*_*sic 5

这是有问题的行:

public static int score = 0;
Run Code Online (Sandbox Code Playgroud)

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

理想情况下,您可以将其设为非静态(这是 Unity 所期望的)。

public int score = 0;
Run Code Online (Sandbox Code Playgroud)

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

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

public int GetScore()
{
    return score;
}

public void Reset()
{
    score = 0;
}
Run Code Online (Sandbox Code Playgroud)

回答了一个更详细地涉及静力学并且可能会引起兴趣的问题。

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

(你可以创建两个Animal类并给每个类一个不同的Name

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

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

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

哦,...如果你决定比分保持静态,你不需要找特定对象,以获得分数...

void Update()
{
    GetComponent<Text>().text = Coin.score.ToString();
}
Run Code Online (Sandbox Code Playgroud)