在Unity上的另一个场景中显示分数

时间:2018-02-22 10:54:55

标签: unity3d unityscript

在游戏中,我正在创建一个游戏结束游戏。一旦玩家输掉游戏就加载的场景。在游戏过程中,分数由玩家在屏幕上的位置计算,并随着玩家的y轴位置的增加而增加。

我使用此代码显示游戏实际播放的场景中的得分:

using UnityEngine;
using UnityEngine.UI;

public class PlayerScore : MonoBehaviour 
{

    public Transform player;
    public Text scoreText; 

    // Update is called once per frame
    void Update() 
    {
        scoreText.text = player.position.y.ToString("0"); 
    }
}

我尝试使用相同的编码来显示玩家在游戏结束时的最终得分。屏幕。我遇到的问题是我无法识别“游戏结束”中的玩家。场景,因为玩家不是该场景中的对象或精灵

有没有一种简单的方法可以将玩家精灵从前一个场景引用到最终(#39; Game Over')场景中,以便我可以用它来确定最终得分?

这是我尝试使用' EndScene'的游戏对象的脚本。在比赛场景中:

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

public class EndMenu: MonoBehaviour 
{

    public Text scoreText;
    public Transform player;
    public static bool GameEnds = false;
    public GameObject endMenuUI;

    void OnCollisionEnter2D(Collision2D exampleCol) 
    {
        if(exampleCol.collider.tag == "Obstacle")
        {
            endMenuUI.SetActive(true);
            Time.timeScale = 0.0001f;
            GameEnds = true;
        }
    }

    public void Retry()
    {
        SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex - 1);
    }

    public void BackToMenu()
    {
        SceneManager.LoadScene("Menu");
    }

    public void Quit()
    {
        Debug.Log("Quitting game...");
        Application.Quit();
    }

    // Update is called once per frame
    void Update()
    {
        scoreText.text = player.position.y.ToString("0");
    }
}

3 个答案:

答案 0 :(得分:1)

您可以使用DontDestroyOnLoad

保持播放器

您可以将其添加到播放器:

void Awake() {
    DontDestroyOnLoad(transform.gameObject);
}

你可以做其他事情,比如只保留数据......但更简单的方法就是这个。

请注意,播放器会保留在游戏画面中。

在我看来,最好的想法可能是在游戏场景中创建一个名为" GameOverScreen"并在需要之前将其禁用。

答案 1 :(得分:0)

我认为最简单的解决方案是将分数存储为静态变量,该变量将在场景加载时保持不变,然后在重新开始时手动重置。例如:

public class PlayerScore : MonoBehaviour 
{

    public Transform player;
    public Text scoreText; 

    public static string scoreString;

    // Update is called once per frame
    void Update() 
    {
        scoreString = player.position.y.ToString("0");
        scoreText.text = scoreString; 
    }
}

现在,您可以从代码中的任何位置访问scoreString,它将是PlayerScore组件上次运行其Update()时的任何内容。然后在EndMenu课程中,您只需更新Retry()BackToMenu()方法即可:

public void Retry()
{
    PlayerScore.scoreString = "0";
    SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex - 1);
}

public void BackToMenu()
{
    PlayerScore.scoreString = "0";
    SceneManager.LoadScene("Menu");
}

您的EndMenu.Update()方法将变为以下内容:

// Update is called once per frame
void Update()
{
    scoreText.text = PlayerScore.scoreString;
}

答案 2 :(得分:0)

///尝试使用playerprefs保存得分

public class PlayerScore : MonoBehaviour 
{

    public Transform player;
    public Text scoreText; 

    // Update is called once per frame
    void Update() 
    {
        scoreText.text = player.position.y.ToString("0"); 
        PlayerPrefs.SetInt("CurrentScore", player.position.y);
    }
}

//对于另一个场景,使用playerprefs.getInt

获取已保存的得分值
public class EndMenu: MonoBehaviour 
{

    public Text scoreText;
    public Transform player;
    public static bool GameEnds = false;
    public GameObject endMenuUI;

    void OnCollisionEnter2D(Collision2D exampleCol) 
    {
        if(exampleCol.collider.tag == "Obstacle")
        {
            endMenuUI.SetActive(true);
            Time.timeScale = 0.0001f;
            GameEnds = true;
        }
    }

    public void Retry()
    {
        SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex - 1);
    }

    public void BackToMenu()
    {
        SceneManager.LoadScene("Menu");
    }

    public void Quit()
    {
        Debug.Log("Quitting game...");
        Application.Quit();
    }

    // Update is called once per frame
    void Update()
    {
        scoreText.text = PlayerPrefs.GetInt("Score",0);
    }
}