在游戏中,我正在创建一个游戏结束游戏。一旦玩家输掉游戏就加载的场景。在游戏过程中,分数由玩家在屏幕上的位置计算,并随着玩家的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");
}
}
答案 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);
}
}