Jump to content
UnitySpain

Aceptamos donaciones vía Paypal.

UnitySpain.com es un servicio gratuito, pero mantener la Comunidad conlleva una serie de gastos.

Fondo Anual Unityspain: Donados 15,00€ de 150,00€

  • Servidor: Dominio.com y Hosting Web
  • Mantenimiento de los Foros
  • Contenido y Servicios Extras
  • Mantenimiento para Redes Sociales
ramunda

Raycast 2d y quitar una vida(resuelto)

Recommended Posts

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.

 

 

 

Edited by pioj
uso correcto de los tags

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites
hace 6 horas, James Roman said:

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.

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

Share this post


Link to post
Share on other sites

×
×
  • Create New...