Unity Spain

Post Antiguos => General (Antiguo) => Mensaje iniciado por: Caesar en Marzo 23, 2016, 09:23:09 PM

Título: UI y Raycast para movimiento
Publicado por: Caesar en Marzo 23, 2016, 09:23:09 PM
Muchos utilizan el movimiento "Click to Move" generalmente usado en juegos rpg, etc. En el cual el personaje se maneja con el mouse; haciendo un click en el terreno donde queremos que el personaje se situé. Yo utilizo un ray "disparado" desde la cámara en el lugar donde se encuentra el mouse, buscando que choque con el terreno para obtener el vector3, que sera mi destino, el cual se lo paso a el NavMeshAgent que cuenta mi personaje.Esto funciona bien, ahora estoy colocando UI para la interfaces (botones de acceso, ventanas, etc), y pasa que el personaje se mueve atras de mis UI, por ejemplo en mi inventario le doy click a mis items y por detrás el personaje esta calculando el movimiento en el terreno, entonces lo que yo quiero; y estoy trabajando en eso, es que cuando aya algún tipo de UI el mouse no calcule el movimiento, mientras no de directamente click en mi terreno no quiero que se mueva.Bueno es lo que quiero a trazos grandes; pero hay mas, yo ya he hecho mi parte y lo que he conseguido es lo siguiente:Primero con EventTrigger, he colocado un bool que condiciona el movimiento mediante raycast y el bool se activa cuando el mouse entra en el area del UI mediante PointerEnter y desactiva con PointerExit.También probé dándole un boxcollider a las UI y detener el ray q colisiona con este tipo de tag(usando render mode del canvas en Camera).En ambos caso funciona parcialmente bien, ya que mientras el personaje esta quieto funciona correctamente, pero cuando doy click en un lugar y el personaje esta en el proceso de desplazamiento a ese lugar, las UI dejan de calcular tanto el eventtrigger como las fisicas de colisiones.Sigo probando haber que mas encuentro pero mientras quisera saber si ya se toparon con este problema, y puedan orientarme en lo que debo hacer
Título: UI y Raycast para movimiento
Publicado por: kaito en Marzo 23, 2016, 09:57:36 PM
 Para ignorar objetos en físicas, se utiliza los layers: http://docs.unity3d.com/Manual/Layers.htmlExiste un objeto llamado LayerMask: http://docs.unity3d.com/ScriptReference/LayerMask.html (http://docs.unity3d.com/ScriptReference/LayerMask.html) que puedes incluir en el código para especificar el/los layer/s que quieres detectar en el raycast.
Título: UI y Raycast para movimiento
Publicado por: isai en Marzo 23, 2016, 10:38:31 PM
@kaito (//<___base_url___>/profile/17765-kaito/) tiene razón 
Título: UI y Raycast para movimiento
Publicado por: Caesar en Marzo 23, 2016, 10:57:17 PM
Una layermask publica y en el inspector le doy las layer UI y la q le creo para el terreno de esa forma no me preocupo de q mi script de movimiento tenga problemas con otros gameobject que pueden ponerse en el camino de la camara al terreno, y muy bien detecta como dije en las fisicas, pero el mismo problema pasa cuando el personaje ya esta en movimiento, durante ese trayecto es como si el editor ignorara que se rendea o algo asi las UI
Título: UI y Raycast para movimiento
Publicado por: isai en Marzo 23, 2016, 11:08:04 PM
¿te refieres a que tu personaje se mueve y este queda debajo de un elemento de la UI?
Título: UI y Raycast para movimiento
Publicado por: Caesar en Marzo 23, 2016, 11:21:09 PM
Haber para aclarar un poco mas las cosas pongo el codigo de mi movimiento:
using UnityEngine;
using System.Collections;

public class TestRay : MonoBehaviour {

NavMeshAgent mover;
public LayerMask agent;

// Use this for initialization
void Start () {
   mover = GetComponent <NavMeshAgent> ();
}

// Update is called once per frame
void Update () {
   if (Input.GetMouseButton(0) && GUIUtility.hotControl ==0)
   {
      RaycastHit hit;
      Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
      if (Physics.Raycast(ray, out hit, 100,agent))
      {
         if (hit.collider.gameObject.layer == 8)
         {
            Vector3 destino = hit.point;
            mover.SetDestination (destino);
            Debug.Log (hit.collider.name);
         }
         else if (hit.collider.gameObject.layer == 5)
         {
            
            Debug.Log (hit.collider.name);
         }
      }
   }
}
100 es mas que suficiente para asegurar que el ray colisione con el terreno, el valor 5 es el layer de las UI y el valor 8 es el layer del terreno, el script funciona bien el movimiento es el que quiero y también cuando doy click sobre alguna UI ya no se mueve mi personaje, el problema es cuando he dado click en algún punto de mi terreno y se setea el destino a mi navmeshagent y el personaje comienza a moverse hacia el lugar, mientras no llegue al lugar ; es decir no este quieto, en este momento al poner el cursor sobre las UI ya no las detecta y me da los datos del terreno, inmediatamente cambia de dirección hacia donde acabo de dar click si es q no habría una UI en ese lugar.Espero haberme dejado entender
Título: UI y Raycast para movimiento
Publicado por: Caesar en Marzo 24, 2016, 04:32:04 AM
Modifique el movimiento para que no use el NavMeshAgent (para probar), y el script funciona perfectamente incluso durante la caminata, puedo dar click en mis UI, por lo menos el tema va por ahi, mientras el NavMeshAgent tranlada al gameobject pasa por alto algunas caracteristicas de las UI o algo asi, es un tanto tecnico y nose como esta contruida esa clase y nesecito el pathfinder espero resolver para usar el NavMesh