Как я могу поделиться оценками через 2 сцены в Unity

Я новичок в Unity. Моя проблема в том, что у меня есть оценка в моей первой сцене, которая является позицией z игрока. Я хочу сохранить его в HighScore с помощью PlayerPrefs. У меня есть 2 пустых объекта с именами MenuManager и GameManager, и у них есть свои сценарии, но я не знаю, как я могу поделиться значением счета и сохранить его в PlayerPrefs. Может кто-нибудь мне помочь? Я не знаю, как мне назначить компонент, если его нет в моей сцене. Также не могли бы вы помочь мне использовать функцию сценария другой сцены. Я имею в виду, как я могу вызвать функцию игрового объекта, находящегося в другой сцене. Пожалуйста помогите. Мне нужно закончить игру.

Скрипт счета, который отслеживает позицию игроков.

using UnityEngine;
using UnityEngine.UI;

public class Score : MonoBehaviour
{
    public Transform player;
    public Text scoreText;
    public HighScore highScore;

    [HideInInspector]public static float totalScore;

    void Update()
    {
        scoreText.text = player.position.z.ToString("0");
        totalScore = player.position.z;
    }
}

Скрипт High Score Script, который отвечает за изменение текста, хотя я еще не работал над настройками проигрывателя, если кто-нибудь знает, пожалуйста, помогите мне и в этом.

using UnityEngine;
using UnityEngine.UI;

public class HighScore : MonoBehaviour
{
    static float floatScore;
    public Text highScore;

    private void Start()
    {
        highScore.text = PlayerPrefs.GetFloat("HighScore", 0).ToString();
    }
    public void highScoreFunc()
    {  
        PlayerPrefs.SetFloat("HighScore", floatScore);
        highScore.text = floatScore.ToString();
    }

    public void resetScore()
    {
        PlayerPrefs.DeleteKey("HighScore");
    }
}

Скрипт функций меню с возможностью использования кнопок.

using UnityEngine;
using UnityEngine.SceneManagement;

public class MenuFunctions : MonoBehaviour
{

    public void StartGame()
    {
        SceneManager.LoadScene(1);
    }

    public void quitGame()
    {
        Application.Quit();
    }
}

Менеджер игры, который меняет сцены и перезапускает игру.

using UnityEngine;
using UnityEngine.SceneManagement;

public class GameManager : MonoBehaviour
{
    bool GameEnd = true;
    public HighScore highScore;
    

    public void EndGame()
    {
        if(GameEnd)
        {
            GameEnd = false;
            Invoke("Restart", 1);
        }
    }
  
    void Restart()
    {
        SceneManager.LoadScene(sceneBuildIndex: 0);
    }
}

person Burhanuddin Nasikwala    schedule 17.10.2020    source источник
comment
Привет! DontDestroyOnLoad - это то, что вы ищете. Также вы можете реализовать шаблон Singleton в своем GameManager.   -  person salyangoz    schedule 17.10.2020
comment
Как я могу это сделать? Есть ли у вас какие-нибудь предложения?   -  person Burhanuddin Nasikwala    schedule 17.10.2020
comment
Я действительно хочу поделиться значением с обеими сценами, а затем я хочу включить скрипт, чтобы я мог поместить его в часть PlayerPref для его сохранения.   -  person Burhanuddin Nasikwala    schedule 17.10.2020


Ответы (1)


class ScoreKeeper{
  public static float HighScore;
}
//where you update player score
ScoreKeeper.HighScore= 10;//Score Value
//Where you want to fetch score
Debug.Log(ScoreKeeper.HighScore);

Объяснение: просто создайте класс (поведение не Mono) и используйте статическую переменную для хранения оценок, к которым можно получить доступ в нескольких сценах.

Что касается PlayerPrefs, вам лучше использовать двоичные файлы

https://www.youtube.com/watch?v=XOjd_qU2Ido&t=825s

Вот отличное объяснение.

person Jack    schedule 17.10.2020
comment
Спасибо, братан, я действительно это сделал. Я сделал общий сценарий оценки, в котором я создал статическую переменную, и у меня был этот сценарий для двух игровых объектов на разных сценах. Итак, я взял переменную и из другого скрипта я взял счет, а затем добавил их в настройки игрока. - person Burhanuddin Nasikwala; 18.10.2020
comment
ладно, вообще-то нельзя добавлять такой скрипт данных ни к каким объектам. Он по-прежнему будет работать, поскольку использует статические переменные. - person Jack; 19.10.2020