Как передавать данные между сценами?

Общие вопросы о Unity3D

Как передавать данные между сценами?

Сообщение EIvanov 16 сен 2022, 17:02

У меня есть игра, где игрок отвечает на вопросы.
В игре две сцены (пусть будет так, для примера).
Первоначально игроку устанавливаются параметры - например, правильных ответов = 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;
}
}
}
}



На сцене 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);
}
}
}


Всё работает - в консоли выводится случайное число (RandomInt).

Но возникают вопросы.
1) Класс Player не статический. Я не создавал его экземпляров. Почему произошел вызов конструктора? Не было ни явного обращения к статике, ни вызова new.
2) Такой подход является нормальным?
3) Не будет ли глюка, когда объект не перейдет со сцены на сцену? Или этот объект вообще никуда не переходит, а становится единственным и неуничтожимым для всех сцен?
4) В случае платформера, где герой (например, марио) переходит с уровня на уровень можно сделать также?
EIvanov
UNIт
 
Сообщения: 103
Зарегистрирован: 05 июл 2021, 17:23

Re: Как передавать данные между сценами?

Сообщение Alkos26Rus 16 сен 2022, 21:57

EIvanov писал(а):Я не создавал его экземпляров. Почему произошел вызов конструктора? Не было ни явного обращения к статике, ни вызова new.

Так у тебя он на сцене валяется, как не создавал экземпляр?

EIvanov писал(а):3) Не будет ли глюка, когда объект не перейдет со сцены на сцену? Или этот объект вообще никуда не переходит, а становится единственным и неуничтожимым для всех сцен?

Не будет глюка, да он будет доступен на всех сценах, запусти редактор там же все видно есть ли объект при переходе на сцену или нет. Будет только проблема когда вернешься на ту сцену где он находится по умолчанию, по идее будет дубликат объекта
Аватара пользователя
Alkos26Rus
Адепт
 
Сообщения: 1642
Зарегистрирован: 26 ноя 2020, 17:52
Откуда: Москва

Re: Как передавать данные между сценами?

Сообщение EIvanov 17 сен 2022, 03:32

EIvanov писал(а):3) Не будет ли глюка, когда объект не перейдет со сцены на сцену? Или этот объект вообще никуда не переходит, а становится единственным и неуничтожимым для всех сцен?

Не будет глюка, да он будет доступен на всех сценах, запусти редактор там же все видно есть ли объект при переходе на сцену или нет. Будет только проблема когда вернешься на ту сцену где он находится по умолчанию, по идее будет дубликат объекта[/quote]
Да объект есть, это видно. Но что делать с дубликатом на стартовой сцене?
Наверно пока это не важно, так как у меня объект находится на стартовой сцене и далее переходит на сцену 1-2-3 1-2-3 то есть стартанул и пошел наматывать круги по сценам и никогда не вернется на стартовую.
EIvanov
UNIт
 
Сообщения: 103
Зарегистрирован: 05 июл 2021, 17:23

Re: Как передавать данные между сценами?

Сообщение 1max1 17 сен 2022, 13:42

Да объект есть, это видно. Но что делать с дубликатом на стартовой сцене?

Удаляй если объект уже имеется, это стандартный шаблон синглтона.
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: Как передавать данные между сценами?

Сообщение Steppe 02 окт 2022, 01:23

Скрытый текст:
Не будет глюка, да он будет доступен на всех сценах, запусти редактор там же все видно есть ли объект при переходе на сцену или нет. Будет только проблема когда вернешься на ту сцену где он находится по умолчанию, по идее будет дубликат объекта
Да объект есть, это видно. Но что делать с дубликатом на стартовой сцене?
Наверно пока это не важно, так как у меня объект находится на стартовой сцене и далее переходит на сцену 1-2-3 1-2-3 то есть стартанул и пошел наматывать круги по сценам и никогда не вернется на стартовую.
Кстати совет есть для всех, кто за компьютером. Следите за здоровьем, а то потом могут проблемы появится! Вот врач уролог в Киеве https://dobro-clinic.com/urologija хороший, который поможет с некоторыми проблемами справится, если появятся от сидячего образа жизни!

спасибо
Steppe
UNец
 
Сообщения: 2
Зарегистрирован: 25 сен 2021, 16:51


Вернуться в Общие вопросы

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 11