Изменение размеров с xy на xz для перетаскивания с помощью клавиши Shift - Задержка ввода - PullRequest
0 голосов
/ 24 декабря 2018

В рамках моего проекта я разработал сферу, которую пользователь может перемещать с помощью мыши.Поскольку перетаскивание в Unity может выполняться только с учетом двух измерений одновременно, я разработал механизм, позволяющий изменить перетаскивание на плоскости xy на перетаскивание на плоскости xz, и наоборот.Однако программа определенно не удобна для пользователя, так как при перетаскивании на 2D-плоскость сложно управлять объектом в трехмерном пространстве (например, плоскость xy или плоскость xz).Эта проблема только усугубляется тем, что существует серьезная проблема задержки ввода.Кажется, что не каждое нажатие на клавишу Shift для смены плоскостей регистрируется, и часто мне приходится нажимать Shift несколько раз, чтобы сменить плоскость.

Я попытался изменить местоположение вызова OnMouseDrag () в разных местах в методе update ().Это не сработало.

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

[RequireComponent(typeof(MeshCollider))]

public class UserController : MonoBehaviour
{


bool shiftOn = false;

void OnMouseDrag()
{

    if (Input.GetMouseButton(0))
    {
        if (shiftOn)
        {
            //3D Drag, courtesy of Unity Forums
            float distance_to_screen = Camera.main.WorldToScreenPoint(gameObject.transform.position).z;
            transform.position = Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, distance_to_screen));
        }

        else
        {
            //Plane Drag
            float distance_to_screen = Camera.main.WorldToScreenPoint(gameObject.transform.position).z;
            Vector3 pos_move = Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, distance_to_screen));
            transform.position = new Vector3(pos_move.x, transform.position.y, pos_move.z);
        }



    }

}

void changeShift()
{
    shiftOn = !shiftOn;
}

// Update is called once per frame
void Update()
{

    if (Input.GetKey(KeyCode.LeftShift) || Input.GetKey(KeyCode.RightShift))
    {
        changeShift();
    }
    OnMouseDrag();



}



}

Задержка на входе все еще существует.Сменные звонки часто не регистрируются, и мне приходится нажимать его несколько раз.Я довольно легко теряю контроль над сферой, пытаясь переключать размеры.

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

Все ответы приветствуются.

Большое спасибо за чтение, и яс нетерпением ждем ваших предложений.

Ответы [ 2 ]

0 голосов
/ 24 декабря 2018
[RequireComponent(typeof(MeshCollider))]
public class UserController : MonoBehaviour
{
    private Vector3 Dist;
    private float PosX = 0.0f;
    private float PosY = 0.0f;
    private float PosZ = 0.0f;
    private bool shiftOn = false;

    private void OnMouseDown()
    {
        Dist = Camera.main.WorldToScreenPoint(transform.position);
        PosX = Input.mousePosition.x - Dist.x;
        PosY = Input.mousePosition.y - Dist.y;
        PosZ = Input.mousePosition.z - Dist.z;
    }
    private void OnMouseDrag()
    {
        if (Input.GetMouseButton(0))
        {
            if (shiftOn) // 3D drag
            {
                transform.position = Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x - PosX, Input.mousePosition.y - PosY, Input.mousePosition.z - PosZ));
            }
            else
            {
                //Plane Drag
                Vector3 pos_move = Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x - PosX, Input.mousePosition.y - PosY, Input.mousePosition.z - PosZ));
                transform.position = new Vector3(pos_move.x, transform.position.y, pos_move.z);
            }
        }
    }

    // Update is called once per frame
    private void Update()
    {

        if (Input.GetKeyDown(KeyCode.LeftShift)||Input.GetKeyDown(KeyCode.RightShift))
        {
            Debug.Log("Shift Pressed"); //Logs message to the Unity Console.
            shiftOn = true;
        }

        if (Input.GetKeyUp(KeyCode.LeftShift) || Input.GetKeyUp(KeyCode.RightShift))
        {
            Debug.Log("Shift Released"); //Logs message to the Unity Console.
            shiftOn = false;
        }
    }
0 голосов
/ 24 декабря 2018

Как известно, Update() называется каждым кадром.

Поэтому, когда вы удерживаете клавишу Shift, в каждом кадре значение shiftOn изменяется из-за функции changeShift().так что если у вас 25fps в 25/2, у вас нет shiftOn = true, и, как следствие, может быть некоторая задержка или задержка в движении объекта.

, поэтому я предлагаю вам изменить код следующим образом:

void Update()
{
    if (Input.GetKeyDown(KeyCode.LeftShift))
    {
        Debug.Log("Shift Pressed"); //Logs message to the Unity Console.
        shiftOn = true;
    }

    if (Input.GetKeyUp(KeyCode.LeftShift))
    {
        Debug.Log("Shift Released"); //Logs message to the Unity Console.
        shiftOn = false;
    }
}

Обновление на основе комментария

Я думаю, чтобы сделать объект немного более плавным, вы должны отделить событие OnMouseDown от OnMouserDrag .by, что означает, что вы должны рассчитать начальную позицию внутри OnMouseDown и рассчитать расстояние и текущую позицию внутри OnMouseDrag, чтобы обновленный код выглядел следующим образом:

Vector3 Dist;
float PosX;
float Posy; 
void Update()
{
    if (Input.GetKeyDown(KeyCode.LeftShift))
    {
        Debug.Log("Shift Pressed");
        shiftOn = true;
    }

    if (Input.GetKeyUp(KeyCode.LeftShift))
    {
        Debug.Log("Shift Released");
        shiftOn = false;
    }
}

private void OnMouseDown()
{
    if(!shiftOn)
    {
        Dist = Camera.main.WorldToScreenPoint(transform.position);
        PosX = Input.mousePosition.x - Dist.x;
        PosY = Input.mousePosition.y - Dist.y;
    }
}

private void OnMouseDrag()
{
    if(!shiftOn)
    {
        Vector3 CurrentPos = new Vector3(Input.mousePosition.x - PosX, Input.mousePosition.y -PosY, Dist.z);
        Vector3 WorldPos = Camera.main.ScreenToWorldPoint(CurrentPos);
        transform.position = WorldPos;
    }
}

Обратите внимание на примерЯ написал для перемещения объекта в 2D, измените его для использования в 3D.

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