Как размещать объекты, проводя пальцем по экрану?

С помощью этого руководства мы можем размещать объекты на поверхности. касанием пальца.

Как мы можем изменить скрипт для размещения объектов во время проведения пальцем по экрану, чтобы размещение объектов было похоже на «рисование» области, где они должны быть размещены?

Вот скрипт для размещения из туториала:

using UnityEngine;
using System.Collections;

public class KittyUIController : MonoBehaviour
{
    public GameObject m_kitten;
    private TangoPointCloud m_pointCloud;

    void Start()
    {
        m_pointCloud = FindObjectOfType<TangoPointCloud>();
    }

    void Update ()
    {
        if (Input.touchCount == 1)
        {
            // Trigger place kitten function when single touch ended.
            Touch t = Input.GetTouch(0);
            if (t.phase == TouchPhase.Ended)
            {
                PlaceKitten(t.position);
            }
        }
    }

    void PlaceKitten(Vector2 touchPosition)
    {
        // Find the plane.
        Camera cam = Camera.main;
        Vector3 planeCenter;
        Plane plane;
        if (!m_pointCloud.FindPlane(cam, touchPosition, out planeCenter, out plane))
        {
            Debug.Log("cannot find plane.");
            return;
        }

        // Place kitten on the surface, and make it always face the camera.
        if (Vector3.Angle(plane.normal, Vector3.up) < 30.0f)
        {
            Vector3 up = plane.normal;
            Vector3 right = Vector3.Cross(plane.normal, cam.transform.forward).normalized;
            Vector3 forward = Vector3.Cross(right, plane.normal).normalized;
            Instantiate(m_kitten, planeCenter, Quaternion.LookRotation(forward, up));
        }
        else
        {
            Debug.Log("surface is too steep for kitten to stand on.");
        }
    }
}

person Rumata    schedule 28.07.2017    source источник


Ответы (1)


Вместо создания котенка по окончании фазы касания вы можете создавать его всякий раз, когда касание перемещается: TouchPhase .Перемещено. Имейте в виду - это создаст МНОГО котят во время перетаскивания, так как это проверяется каждый кадр в методе Update(). Рассмотрите возможность добавления временной задержки или появления только после того, как палец переместится на определенное расстояние.

    void Update ()
    {
        if (Input.touchCount == 1)
        {
            // Trigger place kitten function when single touch moves.
            Touch t = Input.GetTouch(0);
            if (t.phase == TouchPhase.Moved)
            {
                PlaceKitten(t.position);
            }
        }
    }

Проверка расстояния может быть реализована так:

float Vector3 oldpos;

void Update ()
{
    if (Input.touchCount == 1)
    {
        Touch t = Input.GetTouch(0);
        if (t.phase == TouchPhase.Began)
        {
            oldpos = t.position; //get initial touch position
        }
        if (t.phase == TouchPhase.Moved)
        {
            // check if the distance between stored position and current touch position is greater than "2"
            if (Mathf.Abs(Vector3.Distance(oldpos, t.position)) > 2f)
            {
                PlaceKitten(t.position);
                oldpos = t.position; // store position for next distance check
            }
        }
    }
}
person ryeMoss    schedule 28.07.2017
comment
Большое спасибо! Если бы вы могли добавить описание того, как проверить расстояние, на котором перемещался палец, я был бы очень признателен! Хотя это не было включено в вопрос, а также мне нужно проверить, что я не кладу котят друг на друга, поэтому я создаю новый вопрос для решения этой проблемы. - person Rumata; 28.07.2017
comment
Ответ был отредактирован, чтобы включить возможный метод проверки расстояния. - person ryeMoss; 28.07.2017
comment
Большое спасибо за такой подробный ответ! - person Rumata; 29.07.2017