Noticias

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

UI y Raycast para movimiento

Iniciado por Caesar, Marzo 23, 2016, 09:23:09 PM

Tema anterior - Siguiente tema
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

 Para ignorar objetos en físicas, se utiliza los layers: http://docs.unity3d.com/Manual/Layers.html" rel="external nofollow">http://docs.unity3d.com/Manual/Layers.htmlExiste un objeto llamado LayerMask: 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.


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

¿te refieres a que tu personaje se mueve y este queda debajo de un elemento de la UI?

Marzo 23, 2016, 11:21:09 PM #5 Ultima modificación: Marzo 23, 2016, 11:25:17 PM por Caesar
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

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 

Etiquetas: