Unity - как передать объект из сцены1 и создать его экземпляр в сцене2? - PullRequest
1 голос
/ 16 июня 2020

Я хочу создать простое мобильное приложение в Unity, которое позволяет пользователю выбирать рамку изображения, а затем делать с ней что-нибудь.

Итак, у меня есть список префабов (рамок изображений) в scene1. Эта сцена отображается пользователю при запуске приложения.

enter image description here

Пример Изображение того, как это будет выглядеть в моем приложении: enter image description here

Как только пользователь касается одного из этих кадров, он попадает в scene2. Это мой код, который определяет, какие кадры были затронуты: FrameSelection.cs прикреплен к FrameList gameObject.

void Update()
    {
        if (Input.touchCount > 0 && Input.touches[0].phase == TouchPhase.Began)
        {
            Touch touch = Input.touches[0];
            Ray ray = Camera.main.ScreenPointToRay(touch.position);
            RaycastHit hit;
            if (Physics.Raycast(ray, out hit))
            {
                Debug.Log(hit.transform.name);
                if (frameList.Contains(hit.transform.gameObject))
                {
                    //Switch scene
                }
            }
        }

Но как я могу передать выбранный префаб из scene1 в scene2? Я хочу, чтобы префаб создавался только в сцене2, в зависимости от выбранного префаба в сцене1.

В сцене2 у меня есть скрипт, который создает объекты, когда пользователь касается экрана: ObjectSpawner.cs

    void Update()
    {
        if (Input.touchCount > 0 && Input.touches[0].phase == TouchPhase.Began)
        {
            Touch touch = Input.touches[0];
            Ray ray = Camera.main.ScreenPointToRay(touch.position);
            RaycastHit hit;
            if (Physics.Raycast(ray, out hit))
            {
                placedObject = Instantiate(objectToSpawn, hitObject.point,hitObject.transform.rotation);
...

Я пытался избежать разрушения при переключении сцены, используя DontDestroyOnLoad в моем FrameSelection.cs скрипт, но я все еще получаю MissingReferenceException, когда загружена сцена 2.

    void Awake() 
    {
        DontDestroyOnLoad(transform.gameObject);
    }

Я буду рад любой помощи!

Ответы [ 2 ]

1 голос
/ 16 июня 2020

Другой вариант - использовать Scriptable Objects. Это аккуратные небольшие контейнеры данных, которые можно использовать для хранения сложных объектов. Эти данные сохраняются независимо от сцен и классов. Они не требуют большого количества дополнительного кода и должны быть знакомы разработчикам Unity, потому что они помогают выбраться из некоторых неприятных дыр, с которыми вы можете столкнуться при попытке кодирования постоянных данных.

Создайте архитектуру своего кода с помощью сценариев

0 голосов
/ 16 июня 2020

Я слишком много думал об этом, и я мог решить эту проблему, реализовав шаблон singleton, который я прикрепил к frameList. Таким образом, выбранный кадр остается постоянным при переключении сцены. Еще спасибо @ whathm

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...