Вызовите объект на другой сцене C # - PullRequest
2 голосов
/ 15 апреля 2019

У меня есть проблема, я хочу вызвать объект из моей первой сцены, а затем вызвать этот объект во второй сцене. Я пытался сделать это

if (instance == null)
    instance = this;
else if (instance != this)
     Destroy(gameObject);

     DontDestroyOnLoad(gameObject);

и поместите его на объект, который я не хочу разрушать, затем изменили мою сцену на

void Start(){
   SceneManagement.LoadScene("Menu",LoadSceneMode.Single);
}

Но это не так по иерархии

Может ли кто-нибудь мне помочь

EDIT:

* +1012 *enter image description here

Теперь, когда загружена следующая сцена

enter image description here

Объект, который я хотел, больше не существует. Уничтожается

1 Ответ

2 голосов
/ 15 апреля 2019

Создайте постоянный объект

Создайте здесь сцену с предварительным загрузчиком, вы можете разместить заставку или что угодно, но важно загружать вещи, которые должны быть постоянными (например, такие какNetwork или GameManager)

Создайте скрипт PersistentObject.cs и вставьте в него следующий код

private void Awake(){
  DontDestroyOnLoad(this.gameObject);
}

Поместите этот скрипт в любой объект, который вы инициализируете в прелоадере

Доступобъект из любого места

Если вы хотите получить доступ к объекту в другой сцене, есть несколько способов, но я предполагаю, что у вас нет какой-либо конкретной ссылки на объект

Так что если у нас есть GameManager.cs и мы создали постоянный куб в нашем предварительном загрузчике под названием Cube, мы можем получить ссылку на игровой объект, сказав GameObject cube = GameObject.FindGameobjectWithName("Cube");

Теперь вы можете делать все, что захотите, используя cube

Пишите меньше, Делайте больше с синглетами

Создание синглтона также будет очень полезно

public static class Singleton<T>: MonoBehavior where T: MonoBehavior{
  private static T instance;

  //Notice the lower and upper case difference here
  public static T Instance{
    get{
      if(instance == null){
        instance = GameObject.FindGameObjectOfType<T>();
      }
      return instance;
    }
  }
}

Затем вы можете добавить это в свой скрипт, чтобы получить доступИспользование свойств упрощает и уменьшает объем кода, который вы должны написать

public class Cube: Singleton<Cube>{
  private string cubeName = "Jeff";

  public void ChangeCubeName(string newName){
    cubeName = newName;
  }
}

Чтобы получить доступ к этим методам этого класса, теперь вы можете вызывать синглтон из любого места в вашем коде

Пример

public class GameManager: MonoBehavior{
  private void Start(){
    cube.Instance.ChangeCubeName("Joe");
  }
}
...