Noticias

¡RECUERDA QUE SI ERES UN NUEVO USUARIO, DEBES PRESENTARTE PARA PODER PUBLICAR MENSAJES! | TENEMOS CANAL OFICIAL DE TELEGRAM: t.me/unity3dspain

Evitar puntuación duplicada al regresar a la misma escena

Iniciado por Argo214, Noviembre 17, 2015, 09:58:24 AM

Tema anterior - Siguiente tema
[quote author=Angelsm" data-ipsquote-contapp="forums" data-ipsquote-contenttype="forums" data-ipsquote-contentclass="forums_Topic" data-ipsquote-contentid="34443" data-ipsquote-contentcommentid="123706">Ya te lo envié[/quote]no me ha llegado nada bro xD,  madname tu correo por mp para contactarnos asi :)

Noviembre 19, 2015, 09:00:43 PM #16 Ultima modificación: Noviembre 19, 2015, 09:02:46 PM por Antonio
Que lo destruya o lo mantenga, activado o desactivado, da lo mismo, cuando cierra la escena para pasar a otra, y vuelva después a la escena anterior, dicha escena será recargada con los datos originales, no los de la última partida. 

Lo que hace falta es salvar, registrar los datos, en un sistema más "persistente". PlayerPrefs también es mi primera opción, especialmente si tienes que salvar esos datos en el disco duro para que se recuerden en futuras partidas.

La otra alternativa, es el "Don't destroy on Load", esto hace que el objeto donde este puesto, no se elimine al cambiar entre escenas (pero al quitar el juego, sí se destruirá). El caso es que para usar esto, hay que planificar la cosa. Efectivamente puedes aplicar el DontDestroyOnLoad a cada pista de tu escena, pero eso significa que irás arrastrando el objeto en cada nueva escena. No sé cuantas pistas tienen tus niveles, pero imaginando que haya 20 pistas en cada nivel, eso significa que cuando llegues al nivel 15 vas a tener 300 objetos en la escena de los cuales 280 no están sirviendo para nada en ese momento. Y si además resulta que tienen renderers, significa que tendrías que ir activando/ desactivando objetos a medida que vayas entrando en las escenas para que no aparezcan pistas de un nivel anterior dibujadas en el nuevo nivel...

Yo voto por crear un código general, con su archivo. una lista de nodos de tipo personal, y que sea ese archivo sea el que arrastras por las escenas, (poniéndolo en un gameobject independiente y con el DontDestroyOnLoad) y en el código de cada objeto de pista, que todo lo que se cambie se refleje en ese archivo principal, y todo lo que se cargue, lo haga desde ese archivo principal. Algo como esto:

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

public class Pistas_Manager : MonoBehaviour
{
[System.Serializable]
public class PistaNodo
{
   public string Nivel = "//Null";
   public int Pista = 1;
   public bool Encontrado = false;

   public PistaNodo (string n, int p, bool e)
   {
      Nivel = n;
      Pista = p;
      Encontrado = e;
   }
}

public List <PistaNodo> PistasList = new List <PistaNodo>();


// Use this for initialization
void Awake ()
{
   DontDestroyOnLoad (gameObject);
   gameObject.name = "PistasData";
}

public bool ComprobarDatos (int ID)
{
   foreach (PistaNodo n in PistasList)
   {
      if ((Application.loadedLevelName == n.Nivel) && (ID == n.Pista))
      {
         return n.Encontrado; //Si habia datos guardados, devolvera el resultado que habia guardado.
      }
   }

   PistaNodo temp = new PistaNodo (Application.loadedLevelName,ID,false);
   PistasList.Add (temp);
   return false;//Si no, creará un nodo nuevo para guardar los datos y devolverá false, como incialización.
}

public void Encontrado (int ID)
{
   bool hecho = false;

   foreach (PistaNodo n in PistasList)
   {
      if ((Application.loadedLevelName == n.Nivel) && (ID == n.Pista))
      {
         n.Encontrado = true;
         hecho = true;
      }
   }
   if (!hecho)
   {
      print ("Error: fallo al guardar, datos no encontrados");
      PistaNodo temp = new PistaNodo (Application.loadedLevelName,ID,true);
      PistasList.Add (temp); //Se creará.
   }
}
}
using UnityEngine;
using System.Collections;

public class Pistas_Element : MonoBehaviour
{
Pistas_Manager MiManager;
public int ID; //Cada pista debería tener su propio ID, desde -infinito hasta +infinito, sin decimales. Por ejemplo, 0,1,2,3,etc...
bool encontrado;
public GameObject Visual; //Los objetos 3d, o 2d, o lo que sea que tiene que aparecer y desaparecer.

void Start ()
{//Esta función se ejecuta al empezar la escena (y cada vez que recargas la escena, la estas "volviendo a empezar" O_O)

   MiManager = GameObject.Find ("PistasData").GetComponent <Pistas_Manager>();
   encontrado = MiManager.ComprobarDatos (ID);

   if (Visual != null) Visual.SetActive (encontrado);
}

public void OnTriggerEnter(Collider other)
{
   if((other.gameObject.tag == "Player") && (!encontrado))
   {
      encontrado = true;
      if (Visual != null) Visual.SetActive (true);
      MiManager.Encontrado (ID);
   }
}
}

 


Etiquetas: