0

Using this tutorial we can place objects on the surface by finger tap.

How can we change the script to place objects while swiping a finger across the screen, so that placing objects would be like "painting" area where they should be placed?

Here is the script for placing from the tutorial:

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.");
        }
    }
}
Rumata
  • 1,027
  • 3
  • 16
  • 47

1 Answers1

2

Instead of spawning a kitten when the touchphase ends, you can spawn them whenever the touch moves: TouchPhase.Moved. Be warned - this will spawn A LOT of kittens while you drag since this is being checked every frame while in the Update() method. Consider adding a time delay, or only spawning after the finger moves a certain distance.

    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);
            }
        }
    }

A distance check could be implemented like so:

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
            }
        }
    }
}
ryeMoss
  • 4,303
  • 1
  • 15
  • 34
  • Thank you very much! If you could add a description on how to check distance where the finger moved I would really appreciate that! Though it wasn't included in the question, and also I need to check that I'm not placing kittens on top of each other, so I create a new question for solving this problem. – Rumata Jul 28 '17 at 13:54
  • Answer has been edited to include a possible method to check distance. – ryeMoss Jul 28 '17 at 14:15
  • Thank you very much for such a detailed answer! – Rumata Jul 29 '17 at 12:13