2015-04-17 2 views
3

Я делаю игру стрелялки из пушечного ядра. вот короткий код, где я рассчитываю направление прицеливания.Мышь на основе прицеливания Unity3d

  Vector3 mousePos = Input.mousePosition; 
      mousePos.z = thisTransform.position.z - camTransform.position.z; 
      mousePos = mainCamera.ScreenToWorldPoint (mousePos); 

      Vector3 force = mousePos - thisTransform.position; 
      force.z = force.magnitude; 

Это работает, когда оба шара и под углом (0,0,0). Но когда угол меняется, я не могу стрелять в правильном направлении.

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

Текущий код предполагает, что оба значения находятся под углом (0,0,0). Таким образом, в вышеупомянутом случае направление метания всегда неверно.

Я хочу бросить мяч в любом направлении. Но предположим, что это 0 углов и соответственно бросить.

ответ

4

Использование Camera.ScreenToWorldPoint не соответствует действительности.

Вы должны использовать raycasting против самолета. Вот демонстрация без unnecesary математике:

raycasting mouse position against a plane

Raycasting дает вам преимущество, что вы не должны догадаться, как «глубоко» сделал пользовательский щелчок (радиус z координат).

Вот простая реализация выше:

/// <summary> 
/// Gets the 3D position of where the mouse cursor is pointing on a 3D plane that is 
/// on the axis of front/back and up/down of this transform. 
/// Throws an UnityException when the mouse is not pointing towards the plane. 
/// </summary> 
/// <returns>The 3d mouse position</returns> 
Vector3 GetMousePositionInPlaneOfLauncher() { 
    Plane p = new Plane(transform.right, transform.position); 
    Ray r = Camera.main.ScreenPointToRay(Input.mousePosition); 
    float d; 
    if(p.Raycast(r, out d)) { 
     Vector3 v = r.GetPoint(d); 
     return v; 
    } 

    throw new UnityException("Mouse position ray not intersecting launcher plane"); 
} 

демонстрационными: https://github.com/chanibal/Very-Generic-Missle-Command

+0

Отличная работа! Но нужно ли создавать самолет каждый раз, когда я хочу вычислить положение мыши? Да, пожалуйста, вы можете загрузить воспроизводимую демо для всех. –

+0

Demo добавлено в ответе –

+0

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