Чтобы решить проблему с доступом к переменной GameOver в другом скрипте и обеспечить её сброс при перезагрузке сцены, важно использовать правильный подход к обмену данными между скриптами. Переменная GameOver не должна быть статической, так как она не сбрасывается при перезагрузке сцены.
пошаговое руководство:
1. Используйте Singleton для управления состоянием игры – это позволяет поддерживать один экземпляр класса управления состоянием игры.
2. Передайте ссылку на объект при инициализации – это поможет избежать статических переменных и обеспечит сброс значений при перезагрузке сцены.
#### 1. Script GameManager.cs:
using UnityEngine;
public class GameManager : MonoBehaviour
{
public static GameManager Instance { get; private set; }
private bool gameOver;
private void Awake()
{
if (Instance == null)
{
Instance = this;
DontDestroyOnLoad(gameObject);
}
else
{
Destroy(gameObject);
}
}
public bool IsGameOver()
{
return gameOver;
}
public void SetGameOver(bool value)
{
gameOver = value;
}
}
#### 2. Script GameController.cs:
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
public class GameController : MonoBehaviour
{
public Text gameOverText;
void Update()
{
if (GameManager.Instance.IsGameOver())
{
gameOverText.text = "Game Over!";
// Restart the scene or perform other actions
if (Input.GetKeyDown(KeyCode.R))
{
RestartScene();
}
}
}
private void RestartScene()
{
GameManager.Instance.SetGameOver(false); // Reset the game over flag
SceneManager.LoadScene("Krestiki&Noliki1");
}
}
Убедитесь, что объект GameManager существует только в одной сцене, и установите для него свойство DontDestroyOnLoad при первой загрузке. Скрипт GameController использует экземпляр GameManager для получения и установки значения GameOver.
### Основные шаги:
1. Создание Singleton (единственного экземпляра): В классе GameManager это обеспечено с помощью статического свойства Instance.
2. Управление состоянием GameOver через методы IsGameOver() и SetGameOver(bool value).
3. Сброс состояния перед перезагрузкой сцены: В методе RestartScene() сбрасывается значение GameOver.
Теперь при перезагрузке сцены переменная GameOver будет сбрасываться в исходное состояние, и её изменения будут корректно отслеживаться во всех зависимых скриптах.
Переменная bool GameOver; говорит о конце игры.
Она работает, но в другом скрипте мне нужно тоже знать что наступил конец GameOver =true;
Сделал её static и вызвал , но тогда рестарт сцены не срабатывает эту переменную так как не сбрасывает static переменные.
SceneManager.LoadScene("Krestiki&Noliki1");
Что мне делать?
1 . bool GameOver1 = MyClass.GameOver; // (так не подходит)
Пробывал через геттеры и сетеры что-то делаю не правильно
MyClass
{
private bool GameOver;
public void setGameOver(bool over)
{
GameOver = over;
}
Весь код
и тут в конце
public bool getGameOver()
{
{
return GameOver;
}
}
И во втором классе - скрипте пытаюсь вызвать чтение переменной GameOver
Class2
{
MyClass GameOver1 = new MyClass();
GameOver1.getGameOver();
Debug.Log(GameOver1.getGameOver()); // приходит всегда false, даже когда GameOver = true;
}