Unity: изменение положения камеры в зависимости от щелчка объекта между сценами Unity - PullRequest
0 голосов
/ 02 июля 2018

Я создаю игру, которая переводит игрока из изометрического вида сверху на карту в перспективный вид. Игрок начинает с просмотра карты как таковой

Изометрическая проекция карты | Сцена A

При нажатии на любую из плавающих красных сфер игрок перемещается в отдельную сцену на виде в перспективе в месте расположения шара. Показанный здесь,

Перспектива 1 | Сцена B


Перспектива 2 | Сцена B

Изометрическая карта и перспективные карты - это разные сцены, и важно, чтобы они оставались такими же. Игрок должен иметь возможность щелкнуть по сфере в сцене A, а затем заставить камеру переместиться в установленное положение шара в сцене B.

В настоящее время я думаю, что каждый шар может иметь тег (1,2, ...), и после щелчка на этот тег будет ссылаться оператор if, чтобы расположить камеру в другой сцене. Моя проблема в том, что я не знаю, как ссылаться на метку шара, на который нажали, когда попаду в следующую сцену. Или как мне вернуть это к нормальному состоянию, если я вернусь к сцене А.

Вот некоторый код, который я запустил, но я не уверен, что я на правильном пути.

using UnityEngine;
using UnityEngine.SceneManagement;

public class TagCheck : MonoBehaviour
{
    Camera m_MainCamera;

    public string sceneName;

    int count;

    private void Start()
    {
        m_MainCamera = Camera.main;
    }


    void LoadScene()
    {
        SceneManager.LoadScene(sceneName);
        DontDestroyOnLoad(gameObject);
    }

    void OnMouseDown()
    {
        LoadScene();
        Debug.Log(count);
    }

    void OnEnable()
    {
        SceneManager.sceneLoaded += OnLevelFinishedLoading;
    }

    void OnDisable()
    {
        SceneManager.sceneLoaded -= OnLevelFinishedLoading;
    }

    void OnLevelFinishedLoading(Scene scene, LoadSceneMode mode)
    {

        if (count == 1)
        {
            if (GameObject.FindWithTag("1"))
            {
                m_MainCamera.transform.position = new Vector3(5f, 1.5f, 5f);
            }

            else if (GameObject.FindWithTag("2"))
            {
                m_MainCamera.transform.position = new Vector3(-5f, 1.5f, -5f);
            }
        }

        else
        {
            Destroy(gameObject);
        }


    }

Спасибо всем за помощь! Дайте мне знать, если мне нужно что-то уточнить.

Ответы [ 2 ]

0 голосов
/ 02 июля 2018

Я бы абстрагировал информацию о вашем уровне в файл данных JSON или ScriptableObject вместо того, чтобы помещать ее непосредственно в ваш код.

Вы также можете иметь поле Vector3 "TeleportTo" и поле SceneTo "SceneTo" на вашем объекте сферы, на который может ссылаться код.

0 голосов
/ 02 июля 2018

Мне удалось найти решение этой проблемы. Мои шары смены сцен следуют за мной в следующую сцену, присоединяя к ним скрипт DontDestroyOnLoad. В следующей сцене есть пустой игровой объект, который постоянно проверяет объекты с определенными тегами. Когда объект найден, он сообщает контролеру, чтобы он переместил камеру к моему желаемому пустому родителю, а затем сбросил координаты до 0. Вот скрипт проверки,

using System.Collections;
using System.Collections.Generic;
using UnityEngine;



public class tagChecker : MonoBehaviour {

    Camera m_MainCamera;

    void Start()
    {
        m_MainCamera = Camera.main;
    }

    void TagCheck()
    {
        if (GameObject.FindWithTag("1"))
        {
            m_MainCamera.transform.SetParent(GameObject.Find("Perspective1").transform); //GameObject.Find("A").transform.parent;
            m_MainCamera.transform.localPosition = new Vector3(0f, 0f, 0f);
            m_MainCamera.transform.localRotation = Quaternion.identity;
            Destroy(GameObject.FindWithTag("1"));
        }

        else if (GameObject.FindWithTag("2"))
        {
            m_MainCamera.transform.SetParent(GameObject.Find("Perspective2").transform); //GameObject.Find("A").transform.parent;
            m_MainCamera.transform.localPosition = new Vector3(0f, 0f, 0f);
            m_MainCamera.transform.localRotation = Quaternion.identity;
            Destroy(GameObject.FindWithTag("2"));
        }

        else if (GameObject.FindWithTag("3"))
        {
            m_MainCamera.transform.SetParent(GameObject.Find("Perspective3").transform); //GameObject.Find("A").transform.parent;
            m_MainCamera.transform.localPosition = new Vector3(0f, 0f, 0f);
            m_MainCamera.transform.localRotation = Quaternion.identity;
            Destroy(GameObject.FindWithTag("3"));
        }

        else if (GameObject.FindWithTag("4"))
        {
            m_MainCamera.transform.SetParent(GameObject.Find("Perspective4").transform); //GameObject.Find("A").transform.parent;
            m_MainCamera.transform.localPosition = new Vector3(0f, 0f, 0f);
            m_MainCamera.transform.localRotation = Quaternion.identity;
            Destroy(GameObject.FindWithTag("4"));
        }
    }

    void Update()
    {
        TagCheck();
    }
}

Спасибо,

...