Как сохранить вращение объекта в направлении движения касания? - PullRequest
0 голосов
/ 14 марта 2020

Я ищу следующую реализацию в сенсорной игре, основанной на единстве:

  1. Мне нужно, чтобы объект вращался касанием, чтобы его можно было смотреть со всех сторон (пока движется касание)
  2. Объект должен продолжать вращаться в направлении предыдущего движения касания (когда касание заканчивается). Я попытался реализовать приведенный ниже код. Но вращение тихое и необычное. Иногда он вращается слишком быстро, иногда в направлении, противоположном смахиванию et c. Вот что я попробовал:
    using System;
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using UnityEngine.UI;
    public class Functionalities : MonoBehaviour
    {
        public GameObject m_objecttorotate;
        Vector3 localAngle;
        [SerializeField]
        float rotateSpeed = 0.09f;
        Touch touchZero;
        Vector3 rotateAxis;
        float newMouseYpos = 0;
        float prevMouseYpos = 0;
        bool isIncreasing;
        bool isDecreasing;
        bool rotateManually;
        void Update()
        {
            if (Input.touchCount > 0)
            {
                touchZero = Input.GetTouch(0);

                //Rotate the model based on offset
                localAngle = m_objecttorotate.transform.localEulerAngles;
                localAngle.y -= rotateSpeed * touchZero.deltaPosition.x;
                m_objecttorotate.transform.localEulerAngles = localAngle;
                if (touchZero.deltaPosition != Vector2.zero)
                {
                    rotateAxis = touchZero.deltaPosition;
                }
            }
            else
            {
                localAngle.y += rotateSpeed * rotateAxis.y;
                m_objecttorotate.transform.localEulerAngles = localAngle;
            }
            CheckIfTouchIsMovingUpOrDown();
            if (isIncreasing)
            {
                Vector3 newPos = new Vector3(m_objecttorotate.transform.position.x, -0.25f, m_objecttorotate.transform.position.z);
                m_objecttorotate.transform.position = Vector3.Lerp(m_objecttorotate.transform.position, newPos, 1 * Time.deltaTime);
            }
            else if (isDecreasing)
            {
                Vector3 newPos = new Vector3(m_objecttorotate.transform.position.x, 0.25f, m_objecttorotate.transform.position.z);
                m_objecttorotate.transform.position = Vector3.Lerp(m_objecttorotate.transform.position, newPos, 1 * Time.deltaTime);
            }
            else
            {
                Vector3 newPos = new Vector3(m_objecttorotate.transform.position.x, 0f, m_objecttorotate.transform.position.z);
                m_objecttorotate.transform.position = Vector3.Lerp(m_objecttorotate.transform.position, newPos, 1 * Time.deltaTime);

            }
        }

        void CheckIfTouchIsMovingUpOrDown()
        {
            if (Input.GetMouseButton(0))
            {

                if (prevMouseYpos != newMouseYpos)
                {
                    if (prevMouseYpos < newMouseYpos + 1f)
                    {
                        isIncreasing = true;
                        isDecreasing = false;
                        Debug.Log("Increasing");
                        prevMouseYpos = newMouseYpos;
                    }
                    else if (prevMouseYpos > newMouseYpos - 1f)
                    {
                        isDecreasing = true;
                        isIncreasing = false;
                        Debug.Log("Decreasing");
                        prevMouseYpos = newMouseYpos;
                    }
                }
                newMouseYpos = Input.mousePosition.y;
            }

            else
            {
                //isDecreasing = false;
                // isIncreasing = false;
                prevMouseYpos = newMouseYpos;
            }
        }
    }
...