Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Как запросить переменную из другого скрипта

Артём Ляхов Ученик (188), на голосовании 3 месяца назад
Здравствуйте, помогите пожалуйста.

Переменная 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;

}
Голосование за лучший ответ
Татьяна Просветленный (36197) 4 месяца назад
Чтобы решить проблему с доступом к переменной 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 будет сбрасываться в исходное состояние, и её изменения будут корректно отслеживаться во всех зависимых скриптах.
Похожие вопросы