Noticias

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

Raycast 2d y quitar una vida(resuelto)

Iniciado por ramunda, Agosto 14, 2017, 06:03:51 PM

Tema anterior - Siguiente tema
Agosto 14, 2017, 06:03:51 PM Ultima modificación: Agosto 20, 2017, 07:54:59 AM por pioj
Buenas tardes,
 
Tengo un pequeño dilema y no se porque no funciona, seguramente es una tontería pero llevo 2 horas comiéndome la cabeza y no logro encontrar el porque!
 
Tengo un script desde donde controlo las cosas."GameControl";
 

using UnityEngine;
using System.Collections;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
public class GameControl : MonoBehaviour
{
public static GameControl instance;         //referencia del gamee control script que podemos acceder instantaneamente.
public Text scoreText;                  
private int puntos = ;                  
public bool gameOver = false;            
public float scrollSpeed = -1.5f;
public GameObject gameoverr;
public int vidas =;
public Text vidasText;   
 
void Awake()
{
   //si no tenemos el  control...
   if (instance == null)
      //...lo llamamos...
      instance = this;
   //...de lo contrario...
   else if(instance != this)
   //...destruye este porque esta duplicado.
      Destroy (gameObject);
}
void Start()
{
   gameoverr.SetActive (false);
   PlayerPrefs.SetInt ("MyScore",);
   //PlayerPrefs.SetInt ("vidas",0);
   vidasText.text = "Lives: " + vidas.ToString();
}
void Update()
{
   if (vidas <= )
   BirdDied ();
}
public void BirdScored()
{
//      //si el player no puede hacer mas puntos y acabo la partida.
   if (gameOver)   
   return;
   //si el juego no ha terminado, aumentamos el score...
   puntos += 1;
   //...i lo mostramos en el score.
   PlayerPrefs.SetInt ("MyScore", puntos);
   scoreText.text = "Score: " + puntos.ToString();
   vidasText.text = "Lives: " + vidas.ToString();
}
public void BirdDied()
{
   //Activa el gameover.
   gameOver = true;
   gameoverr.SetActive (true);
   PlayerPrefs.GetInt ("MyScore");
}
public void quitavida()
{
   vidas -= 1;
}
}

 
y tengo este otro que registra  un raycast que si no colisiona con el gametag granjero hace una animación y después destruye el GO.
 
Hasta aqui bien la cosa viene cuando le quiero decir que si no has clickado encima de el GO,con el tag " granjero", que se active el sistema de quitar una vida pasados 6 segundos, para eso llamo  a la coorutina quitavida, la cual espera 6 segundos e instancia el void quitavid que se encuentra en el script anterior.Pero no hace tal cosa!
 
este es el script ;
 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class tocagranjero : MonoBehaviour
{
private Animator anim;   
private Rigidbody2D rb2d;   
private GameObject gamecontrol;
public AudioSource audio2;
AudioSource audio;
 
void Start()
{
   anim = GetComponent<Animator> ();
   rb2d = GetComponent<Rigidbody2D>();
   audio = GetComponent<AudioSource> ();
   gamecontrol = GameObject.Find ("GameControl");
 
}
IEnumerator quitavida()
{
   yield return new WaitForSeconds(6);
   GameControl.instance.quitavida ();
   Debug.Log ("te quito una vida");
}
void Update ()
{
   if (Input.GetMouseButtonDown ())
   {
      Vector3 mousePos = Camera.main.ScreenToWorldPoint (Input.mousePosition);
      Vector2 mousePos2D = new Vector2 (mousePos.x, mousePos.y);
      RaycastHit2D hit = Physics2D.Raycast (mousePos2D, Vector2.zero);
      if (hit.collider != null)
      {
         Debug.Log (hit.collider.gameObject.name);
         if (hit.collider.tag == "granjero")
         {
         anim.SetTrigger ("tocado");
         GameControl.instance.BirdScored ();
         Destroy (hit.transform.gameObject, 2);
         audio2.Play ();
         }
      }
   }
   else
   {  
   StartCoroutine ("quitavida");
   }
}
}

 
Espero que sea lo que digo una tontería....y que alguno de ustedes pueda decírmela, muchas gracias de antemano.
 
 
 
 
 
 

el else que llama a la coroutine quitavida deberia estar justo despues del if(hit.collider != null), es decir el funcionamiento de tu codigo actual es que en cada frame si no haces click te va a quitar una vida en 6 seg, imagino que el jugador no logra vivir mas que eso ya que cada frame llama una nueva?, y aun que hagas lo que te he dicho puedes tener errores ya que imagino que tendras diferentes elementos en el juego si clickeas por error en algun elemento X con collider y no es el granjero igual no perderas ninguna vida, te recomiendo usar la version de raycast que utiliza layerMask colocar al granjero en su propia layer y asi de esta manera ignoras los otros elementos que puedan existir.

Cita de: James Roman date=1503115351el else que llama a la coroutine quitavida deberia estar justo despues del if(hit.collider != null), es decir el funcionamiento de tu codigo actual es que en cada frame si no haces click te va a quitar una vida en 6 seg, imagino que el jugador no logra vivir mas que eso ya que cada frame llama una nueva?, y aun que hagas lo que te he dicho puedes tener errores ya que imagino que tendras diferentes elementos en el juego si clickeas por error en algun elemento X con collider y no es el granjero igual no perderas ninguna vida, te recomiendo usar la version de raycast que utiliza layerMask colocar al granjero en su propia layer y asi de esta manera ignoras los otros elementos que puedan existir.
   


muchisimas gracias James Roman , tienes toda la razon , como no lo abia visto...muy amable.Un saludo cordial.

Etiquetas: