Вращение плавно в редакторе, но не в устройстве - PullRequest
0 голосов
/ 22 апреля 2019

У меня есть 3D-объект, который я хочу повернуть с помощью прикосновения мыши / пальца, поэтому я сделал следующий скрипт.

Вращение объекта выглядит плавно в редакторе, но при игре в игру на реальном устройстве (android), вращение не следовало за движением пальца сразу, это занимает несколько миллисекунд, чтобы следовать за пальцем, оно не плавное и управление становится жестким и расстраивающим!

float sensitivity = 0.8f;
Vector2 firstPressPos;
Vector2 secondPressPos;

void Update()
{

    if (Input.GetMouseButtonDown(0))
    {
        //save began touch 2d point
        firstPressPos = new Vector3(Input.mousePosition.x, Input.mousePosition.y);
    }

    if (Input.GetMouseButton(0))
    {
        //save ended touch 2d point
        secondPressPos = new Vector3(Input.mousePosition.x, Input.mousePosition.y);

        if (firstPressPos != secondPressPos)
        {
            float RotX = Input.GetAxis("Mouse X") * sensitivity * Time.deltaTime;
            float RotY = Input.GetAxis("Mouse Y") * sensitivity * Time.deltaTime;
            transform.RotateAround(Vector3.up, RotX);
            transform.RotateAround(Vector3.right, -RotY);
        }
    }
}

Ответы [ 2 ]

2 голосов
/ 23 апреля 2019

попробуйте этот код

// Screen Touches
    Vector2?[] oldTouchPositions = {
        null,
        null
    };
    // Rotation Speed
    public float rotSpeed = 0.5f;

    public void Update()
    {
        if (Input.touchCount == 0)
        {
            oldTouchPositions[0] = null;
            oldTouchPositions[1] = null;
        }
        else if (Input.touchCount == 1)
        {
            if (oldTouchPositions[0] == null || oldTouchPositions[1] != null)
            {
                oldTouchPositions[0] = Input.GetTouch(0).position;
                oldTouchPositions[1] = null;
            }
            else
            {
                Vector2 newTouchPosition = Input.GetTouch(0).position;
                float distanceX = (oldTouchPositions[0] - newTouchPosition).Value.x;
                float distanceY = (oldTouchPositions[0] - newTouchPosition).Value.y;

                float rotX = distanceX * rotSpeed * Mathf.Deg2Rad;
                float rotY = distanceY * rotSpeed * Mathf.Deg2Rad;


                transform.Rotate(Vector3.up, rotX * 5, Space.Self);
                transform.Rotate(Vector3.left, rotY * 5, Space.Self);


                oldTouchPositions[0] = newTouchPosition;

            }
        }
        else
        {
            if (oldTouchPositions[1] == null)
            {
                oldTouchPositions[0] = Input.GetTouch(0).position;
                oldTouchPositions[1] = Input.GetTouch(1).position;
            }
            else
            {

            }
        }
    }
0 голосов
/ 23 апреля 2019

Вот скрипт, который я нашел несколько лет назад и который управляет вращением оси X с помощью мыши или касаний.Кажется, хорошо работает с прикосновениями, но не так хорошо с мышью.Попробуйте и дайте мне знать, если он ведет себя немного лучше.Этот должен регулировать скорость вращения динамически:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class SpinDrag : MonoBehaviour {

    float f_lastX = 0.0f;
    float f_difX = 0.5f;
    float f_steps = 0.0f;
    int i_direction = 1;

    // Use this for initialization
    void Start()
    {

    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            f_difX = 0.0f;
        }
        else if (Input.GetMouseButton(0))
        {
            f_difX = Mathf.Abs(f_lastX - Input.GetAxis("Mouse X"));

            if (f_lastX < Input.GetAxis("Mouse X"))
            {
                i_direction = -1;
                transform.Rotate(Vector3.up, -f_difX);
            }

            if (f_lastX > Input.GetAxis("Mouse X"))
            {
                i_direction = 1;
                transform.Rotate(Vector3.up, f_difX);
            }

            f_lastX = -Input.GetAxis("Mouse X");
        }
        else
        {
            if (f_difX > 0.5f) f_difX -= 0.05f;
            if (f_difX < 0.5f) f_difX += 0.05f;

            transform.Rotate(Vector3.up, f_difX * i_direction);
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...