Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - WalterScript

#1
General (Antiguo) / Problema con los eventos Touch
Septiembre 06, 2018, 06:54:52 PM
Muchas gracias por responder @lightbug ! Finalmente lo he conseguido con las pistas que me has dado 
#2
General (Antiguo) / Problema con los eventos Touch
Septiembre 06, 2018, 05:28:58 PM
Buenas tardes, me encuentro haciendo un juego en 2D y me ha surgido una duda con los eventos Touch pero también con los Raycast para detectar en este caso el collider que estás pulsando.
 
Tengo un sprite 2D que quiero mover por el escenario del juego y conseguí hacerlo pero con colliders 3D ya que era lo que me pareció más sencillo utilizando Raycast y los eventos de Touch(Began, Moved y Ended). El problema llega cuando he intentado convertir esto para colliders 2D ya que ahí tengo edge collider para ajustar el perímetro a mi objeto en 2D. He probado con Raycast2D pero no hay manera de conseguir que con los eventos Touch y un collider 2D se mueva el objeto.
 
Os dejo el código que tengo ahora mismo y con el que me funciona si tengo colliders 3D.
 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[System.Serializable]
public class Boundary
{
    public float xMin, xMax, yMin, yMax;
}
public class TouchManager : MonoBehaviour {
    GameObject gObj = null;
    Plane objPlane;
    Vector3 m0;
    public Boundary boundary;
    Ray GenerateMouseRay(Vector3 touchPos)
    {
        Vector3 mousePosFar = new Vector3(touchPos.x, touchPos.y, Camera.main.farClipPlane);
        Vector3 mousePosNear = new Vector3(touchPos.x, touchPos.y, Camera.main.nearClipPlane);
        Vector3 mousePosF = Camera.main.ScreenToWorldPoint(mousePosFar);
        Vector3 mousePosN = Camera.main.ScreenToWorldPoint(mousePosNear);
        Ray mr = new Ray(mousePosN, mousePosF-mousePosN);
        return mr;
    }
 
    // Update is called once per frame
    void FixedUpdate ()
    {
        if(Input.touchCount > 0)
        {
            if(Input.GetTouch(0).phase == TouchPhase.Began)
            {
                Ray mouseRay = GenerateMouseRay(Input.GetTouch(0).position);
                RaycastHit hit;
                if(Physics.Raycast(mouseRay.origin, mouseRay.direction, out hit))
                {
                    gObj = hit.transform.gameObject;
                    objPlane = new Plane(Camera.main.transform.forward*-1, gObj.transform.position);
                    //calc touch offset
                    Ray mRay = Camera.main.ScreenPointToRay(Input.GetTouch(0).position);
                    float rayDistance;
                    objPlane.Raycast(mRay, out rayDistance);
                    m0 = gObj.transform.position - mRay.GetPoint(rayDistance);
                }
            }
            else if(Input.GetTouch(0).phase == TouchPhase.Moved && gObj)
            {
                Ray mRay = Camera.main.ScreenPointToRay(Input.GetTouch(0).position);
                float rayDistance;
                if(objPlane.Raycast(mRay, out rayDistance))
                {
                    gObj.transform.position = new Vector3(Mathf.Clamp(mRay.GetPoint(rayDistance).x + m0.x, boundary.xMin, boundary.xMax),
                                                          Mathf.Clamp(mRay.GetPoint(rayDistance).y + m0.y, boundary.yMin, boundary.yMax));
                }
            }
            else if(Input.GetTouch(0).phase == TouchPhase.Ended && gObj)
            {
                gObj = null;
            }
        }
    }
}

 
Muchas gracias!
#3
General (Antiguo) / Hola!
Marzo 22, 2018, 05:15:38 PM
Hola a todos! Soy un completo apasionado por el mundo del desarrollo de videojuegos y llevo ya un tiempo usando Unity. Debería haber entrado por aquí mucho antes! 
 
Quiero seguir aprendiendo muchas más cosas y si puedo contar con vosotros lo haré.
 
Un saludo!