Unity Mouse Input без Ray / Raycast и коллайдеров - PullRequest
0 голосов
/ 28 октября 2018

Прежде всего, спасибо за ваше время.Я довольно новичок в этом, поэтому я немного борюсь.Я пытаюсь создать шутер с перетаскиванием, который на самом деле не зависит от коллайдеров или радиопередач, а зависит только от дельты мыши и положения камеры.Я пытаюсь сделать так, чтобы я сопоставлял положение мыши (x, y) с направлением скорости, таким как новый Vector3 (mouseX, 0f, mouseY), а затем поворачивал его вокруг оси Y, чтобы соответствовать визуальному перетаскиванию на экране..

    void OnMouseUp()
{
    releasePos = Input.mousePosition;
    Vector2 m_direction = releasePos - initialPos;
    Vector3 direction = new Vector3(m_direction.x, 0, m_direction.y);
    float userDrag = Mathf.Clamp(direction.magnitude, 0f, maxVelocity);
    direction = Translation(direction);
    direction = Vector3.Normalize(direction);
    rigidbody.velocity = (direction * userDrag) * force;
}

private Vector3 Translation(Vector3 direction)
{
    Vector3 camPos = Camera.main.transform.position;
    camPos.y = 0;
    float angle = Vector3.Angle(new Vector3(0f, 0f, 1f), camPos);
    Quaternion translatedAngle = Quaternion.AngleAxis(angle, Vector3.up);
    direction = translatedAngle * direction;

Но, когда угол меняется, он не дает того, о чем я прошу.Есть ли способ, которым я могу избежать кучу операторов if, else для значения угла или более короткого способа сделать это?

Пример

Ответы [ 2 ]

0 голосов
/ 29 октября 2018

Итак, я думаю, что наконец-то у меня есть решение, и я решил поделиться им с людьми, которые могут быть заинтересованы.

Задача состояла в том, чтобы повернуть направление дельты мыши в соответствии с положением камеры, чтобы оно давало естественную вибрацию.игроку при перетаскивании и отпускании мяча для сдачи.Я провел несколько тестов, чтобы увидеть, где в моем коде возникли проблемы с правильным поворотом дельта-направления (так, чтобы оно соответствовало экрану), и понял, когда я «смотрю из» (0,0,1) для сравнения, в то время как положение x камеры положительно, это работаетхорошо.Но когда x отрицательно, оно не , потому что Vector3.Angle не возвращает отрицательное значение , насколько я понимаю , поэтому я просто умножил результат на минус.Кажется, работает.

Вот окончательный код:

    private void Start()
{
    rigidbody = GetComponent<Rigidbody>();
}

void OnMouseDown()
{
    ballPos = Input.mousePosition;
}

void OnMouseUp()
{
    Vector2 m_direction = Input.mousePosition - ballPos;
    Vector3 direction = new Vector3(m_direction.x, 0, m_direction.y);
    float userDrag = Mathf.Clamp(direction.magnitude, 0f, maxVelocity);
    direction = Translation(direction);
    direction = Vector3.Normalize(direction);
    rigidbody.velocity = (direction * userDrag) * force;
}

private Vector3 Translation(Vector3 direction)
{
    float angle = GetAngle();
    Quaternion translatedAngle = Quaternion.AngleAxis(angle, Vector3.up);
    direction = translatedAngle * direction;
    return direction;
}

private float GetAngle()
{
    Vector3 camPos = Camera.main.transform.position;
    camPos.y = 0;
    if (camPos.x > 0)
    {
        angle = Vector3.Angle(Vector3.forward, camPos);
    }
    else if (camPos.x <0)
    { angle = -Vector3.Angle(Vector3.forward, camPos); }
    return angle;
}

Пожалуйста, поделитесь, если у вас есть предложения относительно кода.

0 голосов
/ 28 октября 2018

OnMouseUp по сути является методом коллайдера.

То есть мышь ДОЛЖНА находиться над коллайдером GameObject для GameObject, к которому прикреплен этот код.Если вы хотите отойти от использования коллайдеров, то вам нужно отойти от этого метода.

Универсальный способ "где угодно" сказать "кнопка мыши вверх или вниз?"это статические методы, доступные в классе Input:

  • Input.GetMouseButtonDown() True для одного кадра после нажатия кнопки мыши
  • Input.GetMouseButtonUp() True для одного кадра послекнопка мыши отпущена
  • Input.GetMouseButton() True - любой кадр, на котором нажата кнопка мыши (в противном случае - false)
...