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
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?

Noviembre 17, 2015, 12:06:56 PM #1 Ultima modificación: Noviembre 17, 2015, 12:07:34 PM por mrpacogp
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 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;

Noviembre 17, 2015, 01:19:28 PM #3 Ultima modificación: Noviembre 17, 2015, 01:20:12 PM por mrpacogp
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 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);
            
        }
        
    }

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...    

Noviembre 18, 2015, 09:46:33 AM #6 Ultima modificación: Noviembre 18, 2015, 09:48:02 AM por Angelsm
[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">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 http://docs.unity3d.com/ScriptReference/Object.DontDestroyOnLoad.html date=1447800438]DontDestroyOnLoad y otros con PlayerPrefs. En cuanto a lo que comentas de crear un sólo tipo de tag para las pistas, si lo hago así ¿cómo se diferenciarán las pistas que van a tener distinta puntuación?Por otro lado, creo que tengo clara la estructura de pantallas y los objetos de cada escena, pero sigo sin saber cómo hacer para que las pistas que encontré en una escena y me dieron puntos, al volver a esa escena sigan apareciendo pero ya no me den puntos. Necesito que me corrijas el código que puse antes para verlo en ese caso en concreto, si te es posible. Gracias de nuevo.

Si quieres el camino fácil, en lo que has puesto, cuando entras al trigger:pista1 = 1? return;Y_Y:_)

Una pregunta, ¿realmente quieres que se sigan manteniendo esos objetos una vez recogidos? ¿No sería mejor que se destruyesen?

Noviembre 18, 2015, 03:25:41 PM #9 Ultima modificación: Noviembre 18, 2015, 03:32:12 PM por Angelsm
[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.

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.

[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 :)

Noviembre 19, 2015, 12:33:10 AM #12 Ultima modificación: Noviembre 19, 2015, 12:34:33 AM por Edgargaza
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.

[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.

Noviembre 19, 2015, 03:09:55 PM #14 Ultima modificación: Noviembre 19, 2015, 03:11:14 PM por Edgargaza
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.

Etiquetas: