Unity Spain

Post Antiguos => General (Antiguo) => Mensaje iniciado por: 0c0de en Agosto 09, 2015, 10:23:22 PM

Título: [Ayuda] Problema con maxima puntuacion en unity
Publicado por: 0c0de en Agosto 09, 2015, 10:23:22 PM
Hola a todos el problema que tengo es que no se como hacer un indicador para la maxima puntuacion el juego que estoy intentado clonar(Porque estoy aprendiendo es flappyBird) lo estoy intentando hacer la mayor parte yo solo en cuanto a scripting me refiero pero al momento de crear ese texto no se como os explico lo que tengo en mis scripts yo lo que tengo puesto para que cuando el player choque reinicie el nivel como en el flappy bird original pero el problema el gran meollo es que me lo resetea todo es decir si pongo cualquier codigo para modificar el texto me lo resetea y me lo deja a 0 os pongo los scripts que tengo hechos:Puntos:
using UnityEngine;
using System.Collections;

public class PointsScore : MonoBehaviour {

    public Transform text;
    [HideInInspector] public int score;
    public Transform TextoHighScore;
    [HideInInspector] public int HighScore;
    // Use this for initialization
    void Start () {
        highScore ();
    }
   
    // Update is called once per frame
    void Update () {
    }

    void OnTriggerEnter2D(Collider2D other){
        if (other.tag == "Check") {
            incrementarPuntuacion();

        }
    }

    public void incrementarPuntuacion()
    {
        score = score+1;
        text.GetComponent<TextMesh>().text = score.ToString();
    }

    public void highScore(){
        if (score > HighScore) {
            HighScore = score;
            TextoHighScore.GetComponent<TextMesh> ().text = HighScore.ToString ();
        }
    }

}
Player:
using UnityEngine;
using System.Collections;

public class Jump : MonoBehaviour {

public Rigidbody2D Avion;
public Vector2 JumpForce;
// Use this for initialization
void Start () {
   JumpForce = new Vector2 (0, 300);
}

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

   if (Input.GetKeyUp (KeyCode.Space) || Input.GetMouseButtonDown(0)) {
      GetComponent<Rigidbody2D>().velocity = Vector2.zero;
      GetComponent<Rigidbody2D>().AddForce(JumpForce);
   }

   Vector2 screenPosition = Camera.main.WorldToScreenPoint(transform.position);
   if (screenPosition.y > Screen.height || screenPosition.y < 0)
   {
      Die();
   }
}

void Die(){
   Application.LoadLevel(Application.loadedLevel);
}

void OnCollisionEnter2D(Collision2D other)
{
   Die();
}
}
En definitiva lo que quiero saber es como hacer para que al reiniciar el nivel no se reinicie el texto de la maxima puntuacion(HighScore)
Título: [Ayuda] Problema con maxima puntuacion en unity
Publicado por: Oaken3d en Agosto 09, 2015, 10:38:31 PM
intenta declarar highScore como Static
public static int highScore;
 
Título: [Ayuda] Problema con maxima puntuacion en unity
Publicado por: 0c0de en Agosto 10, 2015, 10:38:13 AM
[quote author=Oaken3d date=1439152711" data-ipsquote="">intenta declarar highScore como Static
public static int highScore
				Título: [Ayuda] Problema con maxima puntuacion en unity
Publicado por: Antonio en Agosto 10, 2015, 12:41:20 PM
A mi se me ocurren otras 2 ídeas, algo más complicadas.

- La 1º, es colocar el script con las puntuaciones en un objeto independiente, y ponerle al script en la función Start, la instrucción:
DontDestroyOnLoad(transform.gameObject);
http://docs.unity3d.com/ScriptReference/Object.DontDestroyOnLoad.htmlCreo que habrá un inconveniente, y es que cada vez que re-cargas la escena, el objeto de puntos se te duplicaría, (el que hay en la escena + el antiguo que no has destruido). Para evitar esto, pienso que habría que crear una escena anterior a la del nivel (la escena del menú o algo así), y en esa escena, colocar el script de los puntos, y borrar el objeto del nivel en sí. De modo que siempre vayas arrastrando ese mismo objeto que se creó en la escena del menú. 

- La 2º opción sería usar PlayerPrefs para guardar la información de manera más persistente cada vez que pierda o gane, y cargar los datos cada vez que empieza una partida. Esta información se mantendría al quitar y volver a poner el juego, a menos que borres la base de datos en algún momento.

El PlayerPrefs funciona con las funciones de esa clase: http://docs.unity3d.com/ScriptReference/PlayerPrefs.html (http://docs.unity3d.com/ScriptReference/PlayerPrefs.html)

Por ejemplo, cuando quieras guardar pues harías
 
PlayerPrefs.SetInt ("HighscoreSalvado",Highscore);  //Crea en el PlayerPrefs temporal una variable llamada "HighscoreSalvado" y le pone el valor de "Highscore"
PlayerPrefs.Save (); //Pasa los datos del PlayerPrefs temporal al PlayerPrefs permanente.


Y después cuando quieras cargar los datos, pues harías
 
if (PlayerPrefs.HasKey ("HighscoreSalvado") //Si existe la variable en el PlayerPrefs permanente.
{
     Highscore = PlayerPrefs.GetInt ("HighscoreSalvado"); //Coge la información de HigscoreSalvado y la pone en la variable Highscore.
}

Esas son las soluciones que se me ocurren.
Título: [Ayuda] Problema con maxima puntuacion en unity
Publicado por: 0c0de en Agosto 22, 2015, 10:30:41 AM
Bueno el problema de la maxima puntuacion esta solucionado ahora lo que quiero hacer es para que el juego no sea siempre lo mismo y tenga chicha me gustaria ponerle superpoderes tipo invencibilidad y supervelocidad pero el problema es que no se como desabilitar los coliders de las columnas para que cuando tenga habilitado el escudo al tocar una columna muera espero que me podais ayudar de nuevo  public void Die()
    {
   if (PlayerPrefs.HasKey ("highscore")) {
      if (PlayerPrefs.GetInt ("highscore") < GetComponent<PointsScore> ().score) {
         PlayerPrefs.SetInt ("highscore", GetComponent<PointsScore> ().score);
         PlayerPrefs.Save();
      }
   } else {
      PlayerPrefs.SetInt("highscore", GetComponent<PointsScore>().score);
   }
        Application.LoadLevel(0);
    }y para cargar la puntuacion:
void StoredHighScore(){
   if (PlayerPrefs.HasKey ("highscore")) {
      HighScore = PlayerPrefs.GetInt("highscore");
      TextoHighScore.GetComponent<TextMesh>().text = HighScore.ToString();
   }
}
 
Título: [Ayuda] Problema con maxima puntuacion en unity
Publicado por: Antonio en Agosto 22, 2015, 11:01:33 AM
¿Cambiar los colliders de las columnas? se podría hacer accediendo a ellas con un GetComponent para coger su collider y cambiar su variable enabled a false. Pero tendrías que ir haciéndolo en todas las columnas a las que se acerque el personaje.

Me parece que sería más sencillo, crear hacerlo a través de layers, pones a las columnas un layer, (¿"envioronmentCol"?), al jugador otro layer (¿"PlayerCol"?) y  un nuevo layer, llamémosle ¿"GhostBody"?. Cuando el personaje adquiere el modo invencible, su layer cambia a este nuevo layer, y cuando el modo invencible acabe, pues el layer del jugador vuelve a cambiar al layer PlayerCol.Además de eso, deberías ir a Edit -> Project Settings -> Physics, y desmarcar la casilla de GhostBody con environmentCol, para que así, esos 2 colliders no se detecten.

Este método me parece más sencillo porque los cambios los haces en el jugador y su estado, no tienes que ir buscando componentes de los objetos externos.
Título: [Ayuda] Problema con maxima puntuacion en unity
Publicado por: 0c0de en Agosto 22, 2015, 01:23:24 PM
vale pero el codigo que escribo yo es:
 
using UnityEngine;
using System.Collections;

public class Invencible : MonoBehaviour {

public SpriteRenderer Shield;
private GameObject Invencibles;
public GameObject Player;
public GameObject Check;
// Use this for initialization
void Start () {
   Invencibles = this.gameObject;
}

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

   if (Shield.isVisible) {
      Player.layer = 18;

   }

}

void OnTriggerEnter2D(Collider2D other){
   if (other.gameObject.tag == "Check") {
      Invencibles.SetActive(false);
      Shield.gameObject.SetActive(true);

   }
}
}
ahora el problema es el contador de la puntuacion se desabilita, no hay puntuacion a cada solucion un problema nuevo jeejejeAh se me olvidaba gracias por ayudar a este principiante en unity
Título: [Ayuda] Problema con maxima puntuacion en unity
Publicado por: Antonio en Agosto 22, 2015, 07:40:48 PM
Esto es así, una barrera detrás de otra, pero cuando avances, (y encuentres otra barrera) llegará un momento en que mirarás hacia atrás y verás que en el fondo has progresado :3

El temporizador, yo lo hago con 2 variables, Una de ellas, es la duración de esa espera, la otra la que le dice en qué segundo tiene que detenerse el cronómetro, así pues:

 
using UnityEngine;
using System.Collections;

public class Tempo : MonoBehaviour
{
    float TimeEnd;
    float CronoDuration;

    void OnTriggerEnter2D (Collider2D other)
    {
        if (other.gameObject.tag == "Check")
        {
            Shield.gameObject.SetActive (true);
       
            TimeEnd = Time.time + CronoDuration;
            //La iniciamos, si esto se ejecuta en el segundo... ¿284?, y
            //El cronómetro tiene que durar 3 segundos, eso quiere decir que
            //El cronómetro tiene que parar en el segundo 284 + 3 = ¡287!.
            //Fíjate que esta instrucción sólo se activa 1 vez, cuando hace falta.
           
           
            //P.D, yo pondría el PLayer.layer = 18 aqui también, para que no se esté
            //ejecutando constantemente, con cambiar el valor 1 vez, nos vale.
        }
    }
   
    void Update ()
    {
        if (Shield.isActive)
        {
            // Lo que haya aqui se ejecutará mientras esté activo el cronómetro.
            if (Time.time >= TimeEnd)
            {
                //Lo que haya aqui, sólo se ejecutará 1 vez el cronómetro haya
                //llegado a su tiempo definido. Es decir, si Time.time es ¿287?
                // Significa que ya han pasado los 3 segundos desde que se activó.
           
                Shield.gameObject.SetActive (false);
                //Al volver a false, el if anterior deja de ser verda asi
                //que estas instrucciones del cronómetro dejan de ejecutarse.
                //Esto es importante porque sin él, estas instrucciones estarían
                //Ejecutándose contantemente una vez acabado el cronómetro,
                //Y tampoco queremos eso.
            }
        }
    }
}
 
Título: [Ayuda] Problema con maxima puntuacion en unity
Publicado por: 0c0de en Agosto 27, 2015, 11:44:51 AM
Gracias por tu respuesta pero cuando lo ejecuto en el void Update() la variable shield con isVisible, enabled, isActiveandEnabled, isActive() no consigo hacer que me funcione lo he comprobado con un debug.log no se que mas hacer
Título: [Ayuda] Problema con maxima puntuacion en unity
Publicado por: tomas en Diciembre 06, 2015, 04:59:05 AM
Ya se q el post es viejo pero lo que podes hacer es poner 2 columnas una con colider y una sin y al agarrar el escudo se desactive la q tiene el colider y aparesca la otra