2014-01-12 3 views
2

Можно ли изменить переменную в другой сцене в единстве. У меня есть скрипт прямо сейчас, когда пользователь выбирает 5 героев, и эти 5 героев сохраняются в массиве, но для того, чтобы игра работала так, как я этого хочу, этот массив будет в другой сцене, и я не уверен, как чтобы сохранить данные пяти героев в массив в другой сцене. Я могу сделать все это в одной сцене, но 2 сцены будут более эффективными. Вот мой код:Доступ к переменной в другой сцене

using UnityEngine; 
using System.Collections; 

public class HeroChooser : MonoBehaviour { 
public static GameObject Archer; 
GameObject Berserker; 
GameObject Rouge; 
GameObject Warrior; 
GameObject Mage; 
GameObject MainCamera; 
public int counter = 0; 
public bool archerOn = false; 
public bool berserkerOn = false; 
public bool rougeOn = false; 
public bool mageOn = false; 
public bool warriorOn = false; 





// Use this for initialization 
void Start() { 

} 

// Update is called once per frame 
void Update() { 

} 
void OnGUI(){ 
    if(archerOn == false){ 
    if (GUI.Button (new Rect(50,0,50,50), "Archer")){ 
     Archer = GameObject.Find("Archer"); 
     MainCamera = GameObject.Find("Main Camera"); 
     HeroArraySaver heroArraySaver =  MainCamera.GetComponent<HeroArraySaver>(); 
     heroArraySaver.array[counter] = Archer; 
     archerOn = true; 
     counter++; 


    } 
    } 

Ее говорит, что: Статический член HeroArraySaver.array не может быть доступна с ссылкой экземпляра, квалифицировать его с именем типа, а не им не уверен, как идти о ее исправлении.

ответ

3

Простым способом было бы создать пустой GameObject и прикрепить скрипт/MonoBehaviour к тому, что хранит ваши данные. Чтобы это продолжалось, вам нужно будет позвонить DontDestroyOnLoad() в этот GameObject. Это обеспечит, чтобы ваш GameObject зависал при переходе на другую сцену.

Так что-то вроде:

GameObject myPersistentDataObject = new GameObject("myPersistentDataObject"); 
MyDataClass data_class = myPersistentDataObject.AddComponent<MyDataClass>(); 
//set your data to whatever you need to maintain 

И в вашем Пробудитесь вашей MyDataClass вы могли бы сделать что-то вроде

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

Затем в другой сцене, вы можете просто найти свой GameObject снова и восстановить его данные из прилагаемого компонента.

+0

Thanks for the response плохо использовал это спасибо! Но как я могу получить доступ и изменить переменные в другой сцене? – user195122

+0

Просто найдите свой GameObject (возможно, по имени) и используйте GetComponent для извлечения вашего компонента данных. Затем вы можете изменить его по своему усмотрению. – Bart

0

Если у вас есть целые идентификаторы для героев, просто хранить их в статической переменной:

public class GlobalData { 
    public static int[] heroIds; 
} 

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

+0

Спасибо за ответ! Я изменил свой массив на статический массив, но обнаружил, что в моем другом скрипте, который дает значения переменных массива единиц, говорится: Статический член 'HeroArraySaver.array 'не может быть доступен с помощью ссылки на экземпляр, вместо этого присвойте ему имя типа – user195122

+0

Вы didn 'Покажите код для класса 'HeroArraySaver' и в коде, который вы отправили, вы написали' heroArraySaver.array' строчным 'h', а не' HeroArraySaver.array'. Вы должны использовать последний. Также обратите внимание, что если вы храните 'GameObject' в этом массиве, вам также нужно вызвать' DontDestroyOnLoad', как описано в другом ответе. – nwellnhof

Смежные вопросы