Unity Touch Controls - PullRequest
       0

Unity Touch Controls

0 голосов
/ 17 февраля 2020

Прежде всего, я новичок в этом, поэтому любые советы будут безумно полезны. У меня есть код, который делает в основном все, что мне нужно. Я просто не могу понять, как заставить его работать правильно. Основная идея заключается в том, что экран делится по сценарию (ширина делится на 3, а средняя часть используется для разделения y (высоты) на 2 части (если вы нажмите на правую сторону, он перемещается по оси x, и если вы нажимаете на левой стороне экрана, он перемещается влево по оси x). Мне нужно сделать так, чтобы вращение работало только при касании одним пальцем. ось x / z работает, когда два пальца нажаты (удержание), а масштабирование работает, когда пальцы защемлены.Основная проблема заключается в том, что я не могу отличить их один от другого, например, даже если я использую два пальца, вращение одного пальца Я все еще работаю, и я не знаю, как это остановить. Любая помощь действительно ценится, и я извиняюсь Если это трудно понять, я изо всех сил пытался объяснить это.

Для движения двумя пальцами я пытался сделать так (touch2.phase == TouchPhase.stationary), но это не сработало.


CODE `using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class cameramovementsv3 : MonoBehaviour
{
    // MOVEMENT
    public float speed = 2f;
    public float MIN_X;
    public float MAX_X;
    public float MIN_Y;
    public float MAX_Y;
    //private bool DirectionTouch;
    int desiredWidth = Screen.width / 3;

    // ROTATION
    public float Rspeed;
    private Vector3 firstpoint;
    private Vector3 secondpoint;
    public float xAngle = 0.0f;
    public float yAngle = 0.0f;
    public float xAngTemp = 0.0f;
    public float yAngTemp = 0.0f;

    public static bool multiTouchEnabled;
    public GameObject otherObject;



    //PINCHANDZOOM

    public float perspectiveZoomSpeed = 0.5f;        // The rate of change of the field of view in perspective mode.
    public float orthoZoomSpeed = 0.5f;        // The rate of change of the orthographic size in orthographic mode.
    public Camera cam;




    // Start is called before the first frame update
    void Start()
    {
        firstpoint = new Vector3(0, 0, 0);
        secondpoint = new Vector3(0, 0, 0);


        xAngle = 0.0f;
        yAngle = 0.0f;

        transform.rotation = Quaternion.Euler(yAngle, xAngle, 0.0f);
    }

    // Update is called once per frame
    void Update()
    {
        var movement = Vector3.zero;
        Touch touch1 = Input.touches[0];
        Touch touch2 = Input.touches[1];

        if (Input.touchCount == 2)
        {


        }

        foreach (Touch touch in Input.touches)
        { 



            if (touch2.position.x < desiredWidth) // deviding the screen
            {

                Vector3 delta = Input.touches[1].deltaPosition;
                movement.x--;
                transform.Translate(movement * speed * Time.deltaTime, Space.Self);
                transform.position = new Vector3(
                  Mathf.Clamp(transform.position.x, MIN_X, MAX_X),
                  Mathf.Clamp(transform.position.y, MIN_Y, MAX_Y));

            }
            if (touch2.position.x >= 2 * desiredWidth)
            {

                Vector3 delta = Input.touches[1].deltaPosition;
                movement.x++;
                transform.Translate(movement * speed * Time.deltaTime, Space.Self);
                transform.position = new Vector3(
                  Mathf.Clamp(transform.position.x, MIN_X, MAX_X),
                  Mathf.Clamp(transform.position.y, MIN_Y, MAX_Y));

            }
            if (touch2.position.x >= desiredWidth && touch2.position.x < 2 * desiredWidth)
            {
                if (touch2.position.y > Screen.height / 2)
                {
                    Vector3 delta = Input.touches[1].deltaPosition;
                    movement.y++;
                    transform.Translate(movement * speed * Time.deltaTime, Space.Self);
                    transform.position = new Vector3(
                      Mathf.Clamp(transform.position.x, MIN_X, MAX_X),
                      Mathf.Clamp(transform.position.y, MIN_Y, MAX_Y));
                }
            }
            if (touch2.position.x >= desiredWidth && touch2.position.x < 2 * desiredWidth)
            {
                if (touch2.position.y < Screen.height / 2)
                {

                    Vector3 delta = Input.touches[1].deltaPosition;
                    movement.y--;
                    transform.Translate(movement * speed * Time.deltaTime, Space.Self);
                    transform.position = new Vector3(
                      Mathf.Clamp(transform.position.x, MIN_X, MAX_X),
                      Mathf.Clamp(transform.position.y, MIN_Y, MAX_Y));
                }


            }




            else if (touch1.phase == TouchPhase.Moved || touch2.phase == TouchPhase.Moved)
            {


                // Find the position in the previous frame of each touch.
                Vector2 touchZeroPrevPos = touch1.position - touch1.deltaPosition;
                Vector2 touchOnePrevPos = touch2.position - touch2.deltaPosition;

                // Find the magnitude of the vector (the distance) between the touches in each frame.
                float prevTouchDeltaMag = (touchZeroPrevPos - touchOnePrevPos).magnitude;
                float touchDeltaMag = (touch1.position - touch2.position).magnitude;

                // Find the difference in the distances between each frame.
                float deltaMagnitudeDiff = prevTouchDeltaMag - touchDeltaMag;

                // If the camera is orthographic...
                if (GetComponent<Camera>().orthographic)
                {
                    // ... change the orthographic size based on the change in distance between the touches.
                    GetComponent<Camera>().orthographicSize += deltaMagnitudeDiff * orthoZoomSpeed;

                    // Make sure the orthographic size never drops below zero.
                    GetComponent<Camera>().orthographicSize = Mathf.Max(GetComponent<Camera>().orthographicSize, 0.1f);
                }
                else
                {
                    // Otherwise change the field of view based on the change in distance between the touches.
                    GetComponent<Camera>().fieldOfView += deltaMagnitudeDiff * perspectiveZoomSpeed;

                    // Clamp the field of view to make sure it's between 0 and 180.
                    GetComponent<Camera>().fieldOfView = Mathf.Clamp(GetComponent<Camera>().fieldOfView, 20f, 60f);
                }
            }
        }

            if (Input.touchCount > 0)
            {

                if (Input.GetTouch(0).phase == TouchPhase.Began)
                {
                    firstpoint = Input.GetTouch(0).position;
                    xAngTemp = xAngle;
                    yAngTemp = yAngle;
                }
                if (Input.GetTouch(0).phase == TouchPhase.Moved)
                {


                    secondpoint = Input.GetTouch(0).position;

                    yAngle = yAngTemp - (secondpoint.y - firstpoint.y) * 90.0f / Screen.height;

                    if (yAngle < 360)
                        yAngle += 360;
                    if (yAngle > 360)
                        yAngle -= 360;
                    if (yAngle > 90 && yAngle < 270)
                        xAngle = xAngTemp - (secondpoint.x - firstpoint.x) * 180.0f / Screen.width;
                    else
                        xAngle = xAngTemp + (secondpoint.x - firstpoint.x) * 180.0f / Screen.width;

                    if (xAngle < 0)
                        xAngle += 360;
                    if (xAngle > 360)
                        xAngle -= 360;

                    transform.rotation = Quaternion.Euler(yAngle, xAngle, 0.0f);




                }



            }

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