В игре две сцены (пусть будет так, для примера).
Первоначально игроку устанавливаются параметры - например, правильных ответов = 0, ошибочных ответов = 0.
Далее, переходя от сцены к сцене, игрок отвечает на вопросы и его параметры меняются.
Нужно как то передавать эти данные от сцены к сцене.
Что я сделал
На сцене 1, я создал скрипт Player. В его методе Awake прописал DontDestroyOnLoad - т.е. не хочу чтобы объект уничтожался.
На этой же сцене я создал пустой объект Player (назвал как и скрипт) и подключил к нему этот скрипт.
Синтаксис:
Используется csharp
namespace Scripts
{
// Игрок.
public class Player : MonoBehaviour
{
// Не удаляем объект при переходе со сцены.
void Awake()
{
DontDestroyOnLoad(this.gameObject);
}
// Поля класса.
int correctAnswers = 0;
int wrongAnswers = 0;
int randomInt = 0; // Просто для теста, чтобы показать работу конструктора.
// Конструктор
public void Start()
{
SetRandomInt();
}
// Метод класса.
void SetRandomInt()
{
randomInt=Random.Range(0, 100);
}
// Геттеры и сеттеры.
public int RandomInt
{
get
{
return randomInt ;
}
set
{
randomInt =value;
}
}
}
}
{
// Игрок.
public class Player : MonoBehaviour
{
// Не удаляем объект при переходе со сцены.
void Awake()
{
DontDestroyOnLoad(this.gameObject);
}
// Поля класса.
int correctAnswers = 0;
int wrongAnswers = 0;
int randomInt = 0; // Просто для теста, чтобы показать работу конструктора.
// Конструктор
public void Start()
{
SetRandomInt();
}
// Метод класса.
void SetRandomInt()
{
randomInt=Random.Range(0, 100);
}
// Геттеры и сеттеры.
public int RandomInt
{
get
{
return randomInt ;
}
set
{
randomInt =value;
}
}
}
}
На сцене 2 я создал пустой объект с именем Script и одноименный скрипт (Script.cs). Подключил скрипт к объекту.
В скрипте прописал.
Синтаксис:
Используется csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
namespace Scene2
{
public class Script : MonoBehaviour
{
void OnLevelWasLoaded()
{
// Ищем на сцене объект Player (который должен перейти со сцены 1 т.е. не уничтожиться)
GameObject script = GameObject.Find("Player");
Player player = script.GetComponent<Player>();
Debug.Log("Ответов "+player.RandomInt);
}
}
}
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
namespace Scene2
{
public class Script : MonoBehaviour
{
void OnLevelWasLoaded()
{
// Ищем на сцене объект Player (который должен перейти со сцены 1 т.е. не уничтожиться)
GameObject script = GameObject.Find("Player");
Player player = script.GetComponent<Player>();
Debug.Log("Ответов "+player.RandomInt);
}
}
}
Всё работает - в консоли выводится случайное число (RandomInt).
Но возникают вопросы.
1) Класс Player не статический. Я не создавал его экземпляров. Почему произошел вызов конструктора? Не было ни явного обращения к статике, ни вызова new.
2) Такой подход является нормальным?
3) Не будет ли глюка, когда объект не перейдет со сцены на сцену? Или этот объект вообще никуда не переходит, а становится единственным и неуничтожимым для всех сцен?
4) В случае платформера, где герой (например, марио) переходит с уровня на уровень можно сделать также?