c# - samples - virtual reality supported unity
Unidad: pase datos entre escenas (2)
Además de playerPrefs, otra forma sucia es preservar un objeto durante la carga de nivel llamando a DontDestroyOnLoad en él.
DontDestroyOnLoad (transform.gameObject);
Cualquier script adjunto al objeto del juego sobrevivirá y también lo harán las variables en el script. La función DontDestroyOnLoad se usa generalmente para preservar un GameObject completo, incluidos los componentes adjuntos y cualquier objeto secundario que tenga en la jerarquía.
Puede crear un GameObject vacío y colocar solo el script que contiene las variables que desea conservar en él.
¿Cómo puedo pasar el valor de puntaje de una escena a otra?
He intentado lo siguiente:
Escena uno:
void Start () {
score = 0;
updateScoreView ();
StartCoroutine (DelayLoadlevel(20));
}
public void updateScoreView(){
score_text.text = "The Score: "+ score;
}
public void AddNewScore(int NewscoreValue){
score = score + NewscoreValue;
updateScoreView ();
}
IEnumerator DelayLoadlevel(float seconds){
yield return new WaitForSeconds(10);
secondsLeft = seconds;
loadingStart = true;
do {
yield return new WaitForSeconds(1);
} while(--secondsLeft >0);
// here I should store my last score before move to level two
PlayerPrefs.SetInt ("player_score", score);
Application.LoadLevel (2);
}
Escena dos:
public Text score_text;
private int old_score;
// Use this for initialization
void Start () {
old_score = PlayerPrefs.GetInt ("player_score");
score_text.text = "new score" + old_score.ToString ();
}
pero no se muestra nada en la pantalla y no hay error.
¿Es esta la forma correcta de pasar datos?
Estoy usando la edición gratuita de Unity 5, desarrollo el juego para Gear VR (lo que significa que el juego se ejecutará en dispositivos Android).
¿Cualquier sugerencia?
Hay
3
formas de hacerlo, pero la solución a esto depende del tipo de datos que desee pasar entre escenas.
Los componentes / scripts y GameObjects se destruyen cuando se carga una nueva escena e incluso cuando se marca como
static
.
1. Use la palabra clave
static
.
Use este método si la variable para pasar a la siguiente escena no es un componente,
no
hereda de
MonoBehaviour
y no es un GameObject, entonces haga que la variable sea
static
.
Tipos de datos primitivos
int
como
int
,
bool
,
string
,
float
,
double
.
Todas esas variables pueden convertirse en una variable
static
.
Ejemplo de tipos de datos primitivos integrados que se pueden marcar como estáticos :
static int counter = 0;
static bool enableAudio = 0;
static float timer = 100;
Estos deberían funcionar sin problemas.
Ejemplo de objetos que se pueden marcar como estáticos :
public class MyTestScriptNoMonoBehaviour
{
}
entonces
static MyTestScriptNoMonoBehaviour testScriptNoMono;
void Start()
{
testScriptNoMono = new MyTestScriptNoMonoBehaviour();
}
Tenga en cuenta que la clase no hereda de
MonoBehaviour
.
Esto debería funcionar.
Ejemplo de objetos que no se pueden marcar como estáticos :
Cualquier cosa que herede de
Object
,
Component
o
GameObject
no
funcionará.
1A.
Cualquier cosa que herede de
MonoBehaviour
public class MyTestScript : MonoBehaviour
{
}
entonces
static MyTestScript testScript;
void Start()
{
testScript = gameObject.AddComponent<MyTestScript>();
}
Esto
no
funcionará porque hereda de
MonoBehaviour
.
1B.
Todo el objeto del
GameObject
:
static GameObject obj;
void Start()
{
obj = new GameObject("My Object");
}
Esto
tampoco
funcionará porque es un
GameObject
y
GameObject
hereda de un
Object
.
La unidad siempre destruirá su
Object
incluso si se declaran con la palabra clave
static
.
Ver # 2 para una solución alternativa.
2.Utilice la función
DontDestroyOnLoad
.
Solo necesita usar esto si los datos para guardar o pasar a la siguiente escena se heredan de
Object
,
Component
o es un
GameObject
.
Esto resuelve el problema descrito en
1A
y
1B
.
Puedes usarlo para hacer que este GameObject no se destruya cuando se descargue la escena:
void Awake()
{
DontDestroyOnLoad(transform.gameObject);
}
Incluso puede usarlo con la palabra clave
static
resolver el problema de
1A
y
1B
:
public class MyTestScript : MonoBehaviour
{
}
entonces
static MyTestScript testScript;
void Awake()
{
DontDestroyOnLoad(transform.gameObject);
}
void Start()
{
testScript = gameObject.AddComponent<MyTestScript>();
}
La variable
testScript
ahora se conservará cuando se cargue una nueva escena.
3.Guarde en el almacenamiento local y luego cargue durante la siguiente escena.
Este método debe usarse cuando se trata de datos del juego que deben conservarse cuando el juego se cierra y se vuelve a abrir. Ejemplo de esto es el puntaje alto del jugador, la configuración del juego, como el volumen de la música, la ubicación de los objetos, los datos del perfil del joystick, etc.
Hay dos formas de guardar esto:
3A.
Utilice la API
PlayerPrefs
.
Úselo si tiene pocas variables para guardar. Digamos que el puntaje del jugador:
int playerScore = 80;
Y queremos guardar playerScore:
Guarde la puntuación en la función
OnDisable
void OnDisable()
{
PlayerPrefs.SetInt("score", playerScore);
}
OnEnable
en la función
OnEnable
void OnEnable()
{
playerScore = PlayerPrefs.GetInt("score");
}
3B.
Serialice los datos a json, xml o binaray y luego guárdelos usando una de las API de archivos C # como
File.WriteAllBytes
y
File.ReadAllBytes
para guardar y cargar archivos.
Use este método si hay muchas variables para guardar.
En general, debe crear una clase que no herede de
MonoBehaviour
.
Esta clase debe usarse para guardar los datos de su juego para que se puedan serializar o deserializar fácilmente.
Ejemplo de datos para guardar:
[Serializable]
public class PlayerInfo
{
public List<int> ID = new List<int>();
public List<int> Amounts = new List<int>();
public int life = 0;
public float highScore = 0;
}
Tome la clase
DataSaver
, que es un contenedor sobre
File.WriteAllBytes
y
File.ReadAllBytes
que facilita el almacenamiento de datos de
this
publicación.
Crear nueva instancia:
PlayerInfo saveData = new PlayerInfo();
saveData.life = 99;
saveData.highScore = 40;
Guarde los datos de PlayerInfo en un archivo llamado "jugadores":
DataSaver.saveData(saveData, "players");
Cargue datos de un archivo llamado "jugadores":
PlayerInfo loadedData = DataSaver.loadData<PlayerInfo>("players");