почему gameobject / raycast при перетаскивании неточно следует позиции касания в единстве - PullRequest
0 голосов
/ 07 мая 2020

поэтому я сделал скрипт для мультитач с помощью raycast. при более быстром перетаскивании игровой объект будет выпущен, но при медленном перемещении игрового объекта он следует за касанием. здесь коды

Vector2[] startPos = new Vector2[5];
Touch[] touch = new Touch[5];// Update is called once per frame
void FixedUpdate()
{

    Debug.Log(Input.touchCount);
    if (Input.touchCount > 0)
    {
        touch[Input.touchCount-1] = Input.GetTouch(Input.touchCount-1);
        Vector2 worldPoint = Camera.main.ScreenToWorldPoint(touch[Input.touchCount-1].position);
        RaycastHit2D hit = Physics2D.Raycast(worldPoint, Vector2.zero, Mathf.Infinity);

        if (hit.transform != null)
        {
            if (touch[Input.touchCount - 1].phase == TouchPhase.Moved)
            {
                hit.transform.position = worldPoint;]
            }

            else if (touch[Input.touchCount-1].phase == TouchPhase.Began)
            {
                startPos[touch[Input.touchCount-1].fingerId] = worldPoint;
            }

            else if (touch[Input.touchCount-1].phase == TouchPhase.Ended)
            {
                hit.transform.position = startPos[touch[Input.touchCount-1].fingerId];
            }
        }
    }
}

что я могу сделать, чтобы перетащить быстрее без игрового объекта? извините за мой плохой engli sh

1 Ответ

0 голосов
/ 07 мая 2020

одно решение - играть с переменной и тегом bool,

вы сохраняете в памяти игровой объект, который вы перетаскиваете, вы устанавливаете переменную bool в значение true .. это идея, вы пытаетесь использовать bool переменная вместо touchphase.ended / begin ...

this post может вам помочь

Я только что адаптировался к game2D

 GameObject objet = null;
 Plane plane;
 float rayDistance;
 Vector3 Offset;
 bool mouseOver = false;
 bool mousePressed = false;

void FixedUpdate()
{

    if (Input.touchCount > 0)
    {
        mousePressed = true;
    }
    else
    {
        mousePressed = false;
        objet = null;
    }

    Vector2 worldPoint = Camera.main.ScreenToWorldPoint(touch[Input.touchCount - 1].position);
    RaycastHit2D hit = Physics2D.Raycast(worldPoint, Vector2.zero, Mathf.Infinity);

    if (hit.transform != null && hit.collider.tag == "Draggable")
    {
        mouseOver = true;
        if (Input.GetTouch(0).phase != TouchPhase.Moved)
            objet = hit.collider.gameObject;
    }
    else
    {
        if (mousePressed == false)
            mouseOver = false;
    }

    if (mouseOver)
    {
        if (mousePressed)
        {
            //to adapt following your game configuration
            plane = new Plane(Camera.main.transform.forward * -1, objet.transform.position);
            plane.Raycast(ray, out rayDistance);
            objet.transform.position = ray.GetPoint(rayDistance);// + Offset; to see if offset is needed
        }
    }

} // end update
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...