Unity Spain

Post Antiguos => General (Antiguo) => Mensaje iniciado por: Argo214 en Noviembre 17, 2015, 09:58:24 AM

Título: Evitar puntuación duplicada al regresar a la misma escena
Publicado por: Argo214 en Noviembre 17, 2015, 09:58:24 AM
Buenos días! Estoy metido con un juego que en esencia consiste en que el player va buscando objetos por varias escenas y cuando los encuentra recibe puntos. El problema que tengo es al pasar de unas escenas a otras en la búsqueda, que cuando regreso a las escenas en las que ya había estado encuentro que los objetos que me dieron puntos me los siguen dando cuando paso por ellos y lo que quiero es poder seguir viéndolos pero que no me sigan dando puntos. ¿Cómo puedo conseguirlo?
Título: Evitar puntuación duplicada al regresar a la misma escena
Publicado por: mrpacogp en Noviembre 17, 2015, 12:06:56 PM
Pues sencillo. Les pones una bool usado.Cuando se han usado bool = true; con lo cual si es true no des mas puntos.Mas sencillo aún, les quitas el colider, o les cambias el tag, no sé, hay mil opciones. 
Título: Evitar puntuación duplicada al regresar a la misma escena
Publicado por: Argo214 en Noviembre 17, 2015, 01:11:40 PM
[quote author=mrpacogp" data-ipsquote-contapp="forums" data-ipsquote-contenttype="forums" data-ipsquote-contentclass="forums_Topic" data-ipsquote-contentid="34443" data-ipsquote-contentcommentid="123625">Pues sencillo. Les pones una bool usado.Cuando se han usado bool = true; con lo cual si es true no des mas puntos.Mas sencillo aún, les quitas el colider, o les cambias el tag, no sé, hay mil opciones. [/quote]Pero cuando vuelvo a esa escena me lo vuelve a cargar todo sin tener en cuenta que ya había encontrado ese objeto. Pongo a continuación cómo tengo puesto lo que pasa al llegar al objeto por primera vez, pero no sé qué añadir para que al llegar a ese objeto por segunda vez desde otra escena, no siga sumando puntos.void OnTriggerEnter(Collider other)
    {
        
        if (other.gameObject.tag == "pista1"){
            other.gameObject.SetActive(false);
            
            puntuacion = puntuacion + 5;
            TextoContador.text = "Puntos = " + puntuacion;
Título: Evitar puntuación duplicada al regresar a la misma escena
Publicado por: mrpacogp en Noviembre 17, 2015, 01:19:28 PM
Porque al cargar la escena todo vuelve a estar como antes, con lo cual debes de guardar valores o ajustes de una pantalla antes de salir.Por ejemplo, puedes crear un array de objetos y guardarlos en un xml con sus propiedades y luego cargarlos al cargar la escena.O puedes usar la clase de unity playerprefs que te permite guardarlo y luego recuperarlo.int pista1 = Playersprefs.GetInt("Pista1")si pista1= 0 no usado, activalo, si es uno ya está usado.Como lo cambias?, cuando entre al colider, PlayerPrefs.SetInt("Pista1",1);De todas formas, para usar cientos de objetos, yo te recomiendo guardar y cargar todo en un xml o txt.
Título: Evitar puntuación duplicada al regresar a la misma escena
Publicado por: Argo214 en Noviembre 17, 2015, 11:25:28 PM
[quote author=mrpacogp" data-ipsquote-contapp="forums" data-ipsquote-contenttype="forums" data-ipsquote-contentclass="forums_Topic" data-ipsquote-contentid="34443" data-ipsquote-contentcommentid="123627">Porque al cargar la escena todo vuelve a estar como antes, con lo cual debes de guardar valores o ajustes de una pantalla antes de salir.Por ejemplo, puedes crear un array de objetos y guardarlos en un xml con sus propiedades y luego cargarlos al cargar la escena.O puedes usar la clase de unity playerprefs que te permite guardarlo y luego recuperarlo.int pista1 = Playersprefs.GetInt("Pista1")si pista1= 0 no usado, activalo, si es uno ya está usado.Como lo cambias?, cuando entre al colider, PlayerPrefs.SetInt("Pista1",1);De todas formas, para usar cientos de objetos, yo te recomiendo guardar y cargar todo en un xml o txt.[/quote]Muchas gracias!!! He intentado hacer lo que me dices pero no lo consigo. Te pongo lo que he puesto por si me lo puedes corregir. Gracias otra vez.using UnityEngine;
using UnityEngine.UI;
using System.Collections;

public class PuntosPistas : MonoBehaviour {
    
    public static int puntuacion;
    public Text TextoContador;

    int pista1 = PlayerPrefs.GetInt("pista1");
    int pista2 = PlayerPrefs.GetInt("pista2");

    void Start ()
    {
        TextoContador.text = "Puntos = " + puntuacion;
    }

    void OnTriggerEnter(Collider other)
    {

        if (other.gameObject.tag == "pista1"){
            other.gameObject.SetActive(false);
            
            puntuacion = puntuacion + 5;
            TextoContador.text = "Puntos = " + puntuacion;

            PlayerPrefs.SetInt("pista1",1);
        }
            
        if (other.gameObject.tag == "pista2"){
            other.gameObject.SetActive(false);
                
            puntuacion = puntuacion + 10;
            TextoContador.text = "Puntos = " + puntuacion;

            PlayerPrefs.SetInt("pista2",1);
            
        }
        
    }
Título: Evitar puntuación duplicada al regresar a la misma escena
Publicado por: ACarranza en Noviembre 17, 2015, 11:47:18 PM
hola que tal amigo, hay muchas formas de hacer lo que ocupas, yo lo que te recomiendo que primero estructures bien lo que quieres hacer, en papel, anotes, dibujes todo lo que requiere tu juego, haz una lista completa de tus objetos con sus puntos y todas las condiciones que vas a necesitar en tu juego: luego:1) .si tu lista de objetos en si tienen la mismas propiedades y uso, nomas cambia los puntos por asi decirlo, te recomiendo que sean prefabs y que solo uses un tipo de tag digamos "pistas", ademas de usar un script generico para ellos, donde tengas publica la puntuacion y un id como identificador que es lo que estoy viendo requieres.asi cuando uses la funcion OnTriggerEnter compruebas que el tag sea "pistas" y accedes a la variable puntuacion.2). ahora si solo quieres que los objetos se sigan viendo pero no te den puntos, ocupas agregar una condicion mas a tu script del personaje, te recomiendo que sea un array de numeros donde estes guardando el ID del objeto que pasamos por el , cada vez que pasas por los objetos , revisa la lista si el id coincide con alguno de ellos, pues simplemente no agregues los puntos. Toma encuenta que al pasar de una escena a otra todos los objetos se reiniciaran incluyendo tu personaje, entonces ocupas guardar el estado actual de tu personaje con la lista incluida , esto se puede hacer con la funcion http://docs.unity3d.com/ScriptReference/Object.DontDestroyOnLoad.html (http://docs.unity3d.com/ScriptReference/Object.DontDestroyOnLoad.html) , para al paso de de escenas sin destruir al personaje, ya si ocupas guardar los datos para futuras consultas, estan los playerprefbs , serializar o base de datos online, ahi depende de lo que necesites.. PD: con gusto te puedo orientar en lo que quieres hacer ... PD2: hace hambre...PD3: ire a comer bye bye...    
Título: Evitar puntuación duplicada al regresar a la misma escena
Publicado por: Argo214 en Noviembre 18, 2015, 09:46:33 AM
[quote author=ACarranza" data-ipsquote-contapp="forums" data-ipsquote-contenttype="forums" data-ipsquote-contentclass="forums_Topic" data-ipsquote-contentid="34443" data-ipsquote-contentcommentid="123665">hola que tal amigo, hay muchas formas de hacer lo que ocupas, yo lo que te recomiendo que primero estructures bien lo que quieres hacer, en papel, anotes, dibujes todo lo que requiere tu juego, haz una lista completa de tus objetos con sus puntos y todas las condiciones que vas a necesitar en tu juego: luego:1) .si tu lista de objetos en si tienen la mismas propiedades y uso, nomas cambia los puntos por asi decirlo, te recomiendo que sean prefabs y que solo uses un tipo de tag digamos "pistas", ademas de usar un script generico para ellos, donde tengas publica la puntuacion y un id como identificador que es lo que estoy viendo requieres.asi cuando uses la funcion OnTriggerEnter compruebas que el tag sea "pistas" y accedes a la variable puntuacion.2). ahora si solo quieres que los objetos se sigan viendo pero no te den puntos, ocupas agregar una condicion mas a tu script del personaje, te recomiendo que sea un array de numeros donde estes guardando el ID del objeto que pasamos por el , cada vez que pasas por los objetos , revisa la lista si el id coincide con alguno de ellos, pues simplemente no agregues los puntos. Toma encuenta que al pasar de una escena a otra todos los objetos se reiniciaran incluyendo tu personaje, entonces ocupas guardar el estado actual de tu personaje con la lista incluida , esto se puede hacer con la funcion http://docs.unity3d.com/ScriptReference/Object.DontDestroyOnLoad.html , para al paso de de escenas sin destruir al personaje, ya si ocupas guardar los datos para futuras consultas, estan los playerprefbs , serializar o base de datos online, ahi depende de lo que necesites.. PD: con gusto te puedo orientar en lo que quieres hacer ... PD2: hace hambre...PD3: ire a comer bye bye...    [/quote]Muchas gracias! Pero necesito que me ayudes con el código porque soy bastante novato en esto. Parece que hay gente que recomienda hacerlo con  Título: Evitar puntuación duplicada al regresar a la misma escena
Publicado por: mrpacogp en Noviembre 18, 2015, 12:06:08 PM
Si quieres el camino fácil, en lo que has puesto, cuando entras al trigger:pista1 = 1? return;Y_Y:_)
Título: Evitar puntuación duplicada al regresar a la misma escena
Publicado por: nightborn en Noviembre 18, 2015, 02:49:52 PM
Una pregunta, ¿realmente quieres que se sigan manteniendo esos objetos una vez recogidos? ¿No sería mejor que se destruyesen?
Título: Evitar puntuación duplicada al regresar a la misma escena
Publicado por: Argo214 en Noviembre 18, 2015, 03:25:41 PM
[quote author=Edgargaza" data-ipsquote-contapp="forums" data-ipsquote-contenttype="forums" data-ipsquote-contentclass="forums_Topic" data-ipsquote-contentid="34443" data-ipsquote-contentcommentid="123680">Una pregunta, ¿realmente quieres que se sigan manteniendo esos objetos una vez recogidos? ¿No sería mejor que se destruyesen?[/quote]Es un juego donde el player se mueve buscando objetos en los que hay una pista (mensaje) para poder llegar a la siguiente y así sucesivamente. Los Objetos (con su mensaje) están ocultos y se hacen visibles cuando el Player entra en la zona de su Trigger. Al llegar al trigger que activa cada objeto se consiguen puntos. El problema es que si no consigues encontrar todos los objetos del nivel1, por ejemplo, y pasas al nivel 2, pero luego vuelves otra vez al nivel1 para encontrar los que faltan, quiero que estén visibles los objetos que ya encontré, pero que no me den puntos otra vez. Por lo tanto, si los destruyo la primera vez, ya no me aparecerán. Título: Evitar puntuación duplicada al regresar a la misma escena
Publicado por: ACarranza en Noviembre 18, 2015, 06:48:12 PM
que onda, pues mandame un MP , para ayudarte con tu codigo, pero soy mas de los que prefieren darte como una explicacion/clase  y ponerte un reto , relacionado con lo que ocupas y de ahi trates de encontrar tus soliciones, es mas productivo de esa forma  .saludos.
Título: Evitar puntuación duplicada al regresar a la misma escena
Publicado por: Argo214 en Noviembre 18, 2015, 09:47:34 PM
[quote author=ACarranza" data-ipsquote-contapp="forums" data-ipsquote-contenttype="forums" data-ipsquote-contentclass="forums_Topic" data-ipsquote-contentid="34443" data-ipsquote-contentcommentid="123693">que onda, pues mandame un MP , para ayudarte con tu codigo, pero soy mas de los que prefieren darte como una explicacion/clase  y ponerte un reto , relacionado con lo que ocupas y de ahi trates de encontrar tus soliciones, es mas productivo de esa forma :) Título: Evitar puntuación duplicada al regresar a la misma escena
Publicado por: nightborn en Noviembre 19, 2015, 12:33:10 AM
Cita de: Angelsm date=1447879654" data-ipsquote="" data-cite="Angelsm" class="ipsQuote">Ya te lo enviéNo es exactamente lo que quiero, pero si es más sencillo cuéntame cómo lo haría./quote]Asígnale el tag "Player" al jugador y pon este script en el objeto que da puntos al recogerlo:Pista1_Puntuacion.cs
            pickedUp = true;
    }
}
Cuéntame si funciona, y si no, lo intento hacer yo en Unity.
Título: Evitar puntuación duplicada al regresar a la misma escena
Publicado por: Argo214 en Noviembre 19, 2015, 12:26:52 PM
[quote author=Edgargaza" data-ipsquote-contapp="forums" data-ipsquote-contenttype="forums" data-ipsquote-contentclass="forums_Topic" data-ipsquote-contentid="34443" data-ipsquote-contentcommentid="123680 date=1447854592]Una pregunta, ¿realmente quieres que se sigan manteniendo esos objetos una vez recogidos? ¿No sería mejor que se destruyesen?[/quote]No me funciona. El objeto me sigue dando puntos al volver a esa escena.
Título: Evitar puntuación duplicada al regresar a la misma escena
Publicado por: nightborn en Noviembre 19, 2015, 03:09:55 PM
Cita de: Angelsm date=1447932412" data-ipsquote="" data-cite="Angelsm" class="ipsQuoteNo me funciona. El objeto me sigue dando puntos al volver a esa escena.
Yo hice el identificador eh. Es decir, con eso puedes saber si se ha recogido o no. Aplicalo al tema: si es true, no se recoge; si es false, se puede recoger y da puntuación.También puedes hacer todas los terrenos/niveles en una sola escena, y los vas activando con un script, dependiendo del nivel que toque. Así puedes destruirlos, i no se verían.
Título: Evitar puntuación duplicada al regresar a la misma escena
Publicado por: ACarranza en Noviembre 19, 2015, 07:19:34 PM
[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 :) Título: Evitar puntuación duplicada al regresar a la misma escena
Publicado por: Antonio en Noviembre 19, 2015, 09:00:43 PM
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);
   }
}
}

 
Título: Evitar puntuación duplicada al regresar a la misma escena
Publicado por: Argo214 en Noviembre 19, 2015, 11:13:23 PM
Muchas gracias! Lo voy a probar