Перемещение объекта во всех направлениях с помощью мыши в 3D-пространстве - PullRequest
0 голосов
/ 19 декабря 2018

У меня есть этот проект отслеживания, над которым я работал в течение длительного времени.По сути, Пользователь перемещает куб, чтобы отслеживать движения сферы, которая движется случайным образом.В настоящее время я работаю с движениями пользователей.

Проблема в том, что устройство, которое пользователь использует для перемещения во всех направлениях, представляет собой мышь в сочетании с клавишами со стрелками.Это связано с тем, что мышь обрабатывает два измерения (xy), а клавиши со стрелками - два измерения (xz).Тем не менее, я хотел бы позволить мне просто использовать мышь.

Поэтому мой профессор предложил мне использовать клавишу Shift для переключения между движениями xy и xz.Однако я не совсем понимаю, как это сделать.

Приведенный ниже код отражает то, что у меня есть в данный момент, и то, что я пробовал в отношении движений клавиш Shift.

Может кто-нибудьПожалуйста, помогите мне решить эту проблему, или есть лучший способ сделать это?

Спасибо!

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

[RequireComponent(typeof(MeshCollider))]

public class UserController : MonoBehaviour {

public int speed = 20;

// Use this for initialization
void Start()
{

}

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

    // get input data from keyboard or controller
    float moveHorizontal = Input.GetAxis("Horizontal");
    float moveVertical = Input.GetAxis("Vertical");

    // update player position based on input
    Vector3 position = transform.position;
    position.x += moveHorizontal * speed * Time.deltaTime;
    position.z += moveVertical * speed * Time.deltaTime;
    transform.position = position;
}

void OnMouseDrag()
{

    while(Input.GetMouseButton(0))
    {
        int shiftCalled = 0;
        //3D Drag, courtesy of Unity Forums
        if(Input.GetKey(KeyCode.LeftShift))
        {
            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));
        }

        //Plane Drag, courtesy of Unity Forums
        if(Input.GetKey(KeyCode.RightShift))
        {
            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);
        }
    }





}
}

1 Ответ

0 голосов
/ 19 декабря 2018

Вот что я бы сделал -

Представьте себе луч, идущий от положения мыши на вашем экране к плоскости 2D, растягивающейся по углам X и Z.Пересечение указанного луча с плоскостью будет координировано по X, Z, так что вы хотите, чтобы ваш объект перетаскивался.Теперь представьте, что тот же луч пересекается с другой плоскостью, которая растягивается по координатам X и Y.Это сгенерирует другой тип движения, который вы ищете.

Удерживая кнопку SHIFT, вы по сути меняете эти две плоскости, что должно генерировать искомый результат.

Выможно сгенерировать обе плоскости в коде с помощью -

xy_Plane = new Plane(Vector3.forward, m_DistanceFromCamera);
xz_Plane = new Plane(Vector3.up, m_DistanceFromCamera);

Сгенерировать лучи с помощью -

 Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);

        //Initialise the enter variable
        float enter = 0.0f;

        if (xy_Plane.Raycast(ray, out enter))
            Vector3 hitPoint = ray.GetPoint(enter);

и проверить, какую плоскость следует использовать с -

if(Input.GetKey(KeyCode.Shift))

Сейчасвам нужно только переместить ваш объект на основе полученной вами HitPoint.

Надеюсь, это поможет.

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