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
enelmenu

Ayuda Consulta - Raycast

Recommended Posts

Hola! espero que esten bien.

Bueno, estube dandole vueltas y vueltas a los RayCast y todabia nose manejarlos bien, es decir, entiendo toda su mecanica a la perfeccion, pero en le codigo me hace cosas raras... y la verdad que me frustra bastante estos raycastsitos....

Bueno la cuestion es que necesito simplificar este despelote asqueroso, o nose si es asqueroso, por ahi es la unica forma de hacerlo, pero miren...

	public bool castHitForward;
	public bool castHitBack;
	public bool castHitLeft;
	public bool castHitRight;

	private void Update() {
		RaycastHit hitForward;
		RaycastHit hitBack;
		RaycastHit hitLeft;
		RaycastHit hitRight;

		castHitForward = Physics.Raycast(new Ray(transform.position, Vector3.forward), out hitForward, 0.2f);
		castHitBack = Physics.Raycast(new Ray(transform.position, Vector3.back), out hitBack, 0.2f);
		castHitRight = Physics.Raycast(new Ray(transform.position,Vector3.right), out hitRight,0.2f);
		castHitLeft = Physics.Raycast(new Ray(transform.position, Vector3.left), out hitLeft, 0.2f);

		if (castHitForward) 
			Debug.Log(hitForward.collider.name);
		if (castHitBack)
			Debug.Log(hitBack.collider.name);
		if (castHitRight)
			Debug.Log(hitRight.collider.name);
		if (castHitLeft)
			Debug.Log(hitLeft.collider.name);
	}

	private void OnDrawGizmos(){
		Gizmos.DrawRay(transform.position, Vector3.forward * 0.2f);
		Gizmos.DrawRay(transform.position, Vector3.back * 0.2f);
		Gizmos.DrawRay(transform.position, Vector3.right * 0.2f);
		Gizmos.DrawRay(transform.position, Vector3.left * 0.2f);
	}

Bueno, todo eso hace esto simplemente...

A6EDrpJ.png?1

Bueno, en el centro pueden ver lo que estoy haciendo...
En el ejemplo 1 muestro lo que hace mi codigo lo cual no es eficiente...
En el ejemplo 2 muestro lo que quiero, simplemente dos raycast, o linecast nose como mierda funiconan...

La cuestion es que ya intente hacer los dos, y como que solamente me toma por ejemplo si largo el cast de A hasta B me toma los hit con direccion de B hasta A
Osea... si creo un Cast desde a hasta b  A-----B   me toma el hit asi...  A-----B<-----HIT  El Physic es TRUE ....Pero si intento esto HIT----->A-----El Physic es FALSE No me lo toma.....

Entiendo que un Ray(rayo) dispara de su direccion hasta la otra direccion entonces es razonable que solo tome el hit de B... peero tambien intente con LineCast y pasa lo mismo, en una linea no tiene sentido... Ahi ya mi logica se rompe y sobre pasa mis leyes naturales que conosco jajaja

Tambien pense en un BoxCast pero no tengo ni puta idea como usarlo, y no me vengan con la API de unity que no especifica nada  sobre eso :/

Entonces como genero un Cast que me lo tome en ambas direcciones? HIT----->A-----B<-----HIT TRUE Ambos(como en el ejemplo 2, donde usaria simplemente 2 hits)... como lo hago? es posible?, en el caso de no ser posible... como hago mas eficiente el codigo?....

Espero que hayan entendido mis ejemplos(sino pruebenlo ustedes mismos y me van a entender)... Saludos.

Share this post


Link to post
Share on other sites

No entiendo tu problema... Quieres comprobar las colisiones en 4 direcciones usando solo dos 2 raycast? No entiendo porque te quieres complicar tanto ¿para ahorrar unas lineas de código? ¿por rendimiento?

Si quieres ordenar un poco el código usa una función a parte para que el Update quede más limpio. Y en cuanto el rendimiento, me imagino que hacer un raycast el doble de largo debe tener un coste cercano a hacer dos de la mitad de largo. Si quieres mejorar el rendimiento define un layer mask.

Share this post


Link to post
Share on other sites
9 hours ago, enelmenu said:

entiendo toda su mecanica a la perfeccion, pero en le codigo me hace cosas raras

Ajaj entonces no las entendes "a la perfeccion".

Lo que planteas en 1 vs en 2 no es lo mismo, un raycast hace un cast basandose en dos/tres importantes parametros:

  1. punto de inicio
  2. direccion (relativa al punto anterior)
  3. distancia a considerar

En el ejemplo 2 la unico forma de lograr tener tres ray es si lo haces desde afuera hacia adentro, te va a funcionar un solo lado (el lado que sale el ray), el opuesto(en el que entra) te va a quedar alreves, lo cual resulta en que no podes hacerlo del modo 2, si lo que queres es castear en todas las direcciones "correctamente" . Hay una forma de hacerñp pero funciona en condiciones especiales pero por ratonear dos rays ... vamos ...

Mira si lo que te interasa es evaluar solo el nombre de lo que toca o realizar algo en la normal, point, lo que quieras, independientemente de que si es el de adelante/atras/costados podes reutilizar el raycastHit:

	RaycastHit hitInfo;
	const float rayDistance = 0.2f;

	private void Update() {		
				
		if( Physics.Raycast(new Ray(transform.position, Vector3.forward), out hitInfo, rayDistance) )
			Debug.Log(hitInfo.collider.name);
		
		if( Physics.Raycast(new Ray(transform.position, Vector3.back), out hitInfo, rayDistance) )
			Debug.Log(hitInfo.collider.name);

		if( Physics.Raycast(new Ray(transform.position,Vector3.right), out hitInfo,rayDistance) )
			Debug.Log(hitInfo.collider.name);

		if( Physics.Raycast(new Ray(transform.position, Vector3.left), out hitInfo, rayDistance) )
			Debug.Log(hitInfo.collider.name);
		
	}

	private void OnDrawGizmos(){
		Gizmos.DrawRay(transform.position - Vector3.forward * rayDistance, Vector3.forward * 2 * rayDistance);
		Gizmos.DrawRay(transform.position - Vector3.right * rayDistance, Vector3.right * 2 * rayDistance);
	}

- Reutiliza los Raycast cuando puedas

- No uses publics bool, y si las usas para pedirlas de afueras aunque sea ponelas con [HideInTheInspector] (algo asi para no tocarlas, mas por tema de prolijidad)

- Fijate el truco de los gizmos, no necesitas dibujar en todas las dir, solo dibujar, te ahoras la mitad de gizmos. (No se si quedo bien pero la idea se entiende)

- Y siempre que puedas defini tu variable arriba, sabes que la distancia no cambia, el 0.2f, y si encima no cambia en la ejecucion del codigo podes valerte del const.

Edited by lightbug

Share this post


Link to post
Share on other sites

@lightbug Perfecto! eso es lo que necesitaba saber, puedo reutilizar un RaycastHit para obtener datos... Yo pensaba que solo se usaba por cada cast, lo habia probado reutilizar, pero estaba crando la variable en el update, y se sobreescribia pasaban cosas raras, ahora entendi mejor!

Si jajajaja muy a la perfeccion no lo entendia, pero ahora ya esta! gracias juan!

Muchas gracias!!!
Abrazo!

@lightbug
A no.. para bro no puedo reutilizar mi RaycastHit como yo quiero :/...
Mira necesito hacer esto:

		Physics.Raycast(new Ray(transform.position, Vector3.forward), out hitInfo, rayDistance);
		Physics.Raycast(new Ray(transform.position, Vector3.back), out hitInfo, rayDistance);
		Physics.Raycast(new Ray(transform.position,Vector3.right), out hitInfo, rayDistance);
		Physics.Raycast(new Ray(transform.position, Vector3.left), out hitInfo, rayDistance);

		if (hitInfo.collider.name == "Cube (7)")
			Debug.Log("Hit");

Y me toma solamente el left... como que se sobreescribio todo lo demas u.u por que pasa esto?
Necesito hacerlo asi para hacerlo mejor, sino tengo q hacer muchos if para una sola cosa y no tiene sentido, como lo hago?

Edited by enelmenu

Share this post


Link to post
Share on other sites

Por eso te puse si los usabas independientemente uno d otro, ej donde haya un cast destruyo el obj ponele. Aunque Si queres evaluar algo para el left por ej pone el if luego de hacer el cast para el left y no al final. El raycast hit lo podes crear en la clase o dentro del update no hay problema

Edited by lightbug

Share this post


Link to post
Share on other sites
Ahora, lightbug said:

Por eso te puse si los usabas independientemente uno d otro, ej donde haya un cast destruyo el obj ponele. Aunque Si queres evaluar algo para el left por ej pone el if luego de hacer el cast para el left y no al final. El raycast hit lo podes crear en la clase o dentro del update no hay problema

No entiendo :/
probe asi y tampoco

		Physics.Raycast(new Ray(transform.position, Vector3.forward), out hitInfo, rayDistance);
		if (hitInfo.collider.name == "Cube (7)")
			Debug.Log("Hit");
		Physics.Raycast(new Ray(transform.position, Vector3.back), out hitInfo, rayDistance);
		if (hitInfo.collider.name == "Cube (7)")
			Debug.Log("Hit");
		Physics.Raycast(new Ray(transform.position,Vector3.right), out hitInfo, rayDistance);
		if (hitInfo.collider.name == "Cube (7)")
			Debug.Log("Hit");
		Physics.Raycast(new Ray(transform.position, Vector3.left), out hitInfo, rayDistance);
		if (hitInfo.collider.name == "Cube (7)")
			Debug.Log("Hit");

En ese caso solamente me toma el forward.... como que toma su anterior el hitinfo, y lo demas no me da pelota.................. que carajo?

Share this post


Link to post
Share on other sites
9 hours ago, enelmenu said:

En ese caso solamente me toma el forward.... como que toma su anterior el hitinfo, y lo demas no me da pelota.................. que carajo?

Como te va a tomar los demas lados si estas disparando en distintas direcciones? Ojo te lo puede tomar si tuvieras ese cube(7) atravesado y quedara para q toque con dos rays

Edited by lightbug

Share this post


Link to post
Share on other sites

×
×
  • Create New...