Как сделать облёт камерой вокруг объекта.


Например у вас ситуация, когда надо иметь возможность крутить камеру мышкой вокруг какого-то объекта. Это может быть персонаж или рассматривание объекта в инвентаре или просто надо сосредоточится на какой-то точке. Это очень просто сделать!

Создайте на сцене простой объект-цель куб и приблизьте к нему дефолтную камеру поближе, если она вдруг очень далеко.

Создаём единственный скрипт, который будет контролировать нашу идею и соответственно он должен иметь ссылки на камеру  и на объект в  сцене. Плюс добавим свойство для скорости движения камеры, ведь она может вращаться как быстро, так и медленно.

  1. using UnityEngine;
  2.  
  3. public class CameraOrbit : MonoBehaviour
  4. {
  5.     public Camera cam;
  6.     public Transform targetObject;
  7.     public float orbitSpeed = 10f;
  8. }

Вы можете повесить этот скрипт на любой объект в сцене.

Перетащите в поле cam вашу камеру, а в поле targetObject объект-цель со сцены. Скорость пока можете не менять, вдруг она подойдёт.

Все движения камеры будем обрабатывать в Update и так как ваш объект может двигаться, сделаем так, чтобы камера автоматически изначально нацеливалась на него. 

  1. using UnityEngine;
  2.  
  3. public class CameraOrbit : MonoBehaviour
  4. {
  5.     public Camera cam;
  6.     public Transform targetObject;
  7.     public float orbitSpeed = 10f;
  8.  
  9.     void Update()
  10.     {
  11.         cam.transform.LookAt(targetObject, Vector3.up);
  12.     }
  13. }

Сначала сделаем так, чтобы при зажатии ЛКМ и движении, камера крутилась вокруг объекта по оси Y (как будто водим хоровод вокруг ёлочки в детском садике). Для этого ловим само зажатие и узнаём - насколько сдвинулась мышь по X на экране и крутим камеру с нашей скоростью.

  1. void Update()
  2. {
  3.     cam.transform.LookAt(targetObject, Vector3.up);
  4.  
  5.     if (Input.GetMouseButton(0))
  6.     {
  7.         float deltaX = Input.GetAxis("Mouse X");
  8.         cam.transform.RotateAround(targetObject.transform.position, Vector3.up, deltaX * orbitSpeed);
  9.     }
  10. }

Метод RotateAround в данном случае принимает следующие параметры:

  1. центр, вокруг которого будет кручение
  2. ось по которой будет кручение 
  3. угол на который прокрутить объект 


Это должно выглядеть как-то так


Теперь так же добавим кручение камерой вверх и вниз, чтобы можно было посмотреть на лысину объекта или подсмотреть снизу на  Лару Крофт. Для этого уже будем ловить сдвиг мыши по Y и вертеть камеру относительно её собственной оси X.

  1. void Update()
  2. {
  3.     cam.transform.LookAt(targetObject, Vector3.up);
  4.  
  5.     if (Input.GetMouseButton(0))
  6.     {
  7.         float deltaX = Input.GetAxis("Mouse X");
  8.         float deltaY = Input.GetAxis("Mouse Y");
  9.  
  10.         cam.transform.RotateAround(targetObject.transform.position, Vector3.up, deltaX * orbitSpeed);
  11.         cam.transform.RotateAround(targetObject.transform.position, cam.transform.right, deltaY * -orbitSpeed);
  12.     }
  13. }

Сейчас уже можно облететь объект со всех сторон


Но конечно же хочется иметь возможность приближаться и отдалятся. Для этого уже будем использовать ПКМ. Добавьте ещё пару строчек и весь код выглядит таким образом:

  1. using UnityEngine;
  2.  
  3. public class CameraOrbit : MonoBehaviour
  4. {
  5.     public Camera cam;
  6.     public Transform targetObject;
  7.     public float orbitSpeed = 10f;
  8.  
  9.     void Update()
  10.     {
  11.         cam.transform.LookAt(targetObject, Vector3.up);
  12.  
  13.         if (Input.GetMouseButton(0))
  14.         {
  15.             float deltaX = Input.GetAxis("Mouse X");
  16.             float deltaY = Input.GetAxis("Mouse Y");
  17.  
  18.             cam.transform.RotateAround(targetObject.transform.position, Vector3.up, deltaX * orbitSpeed);
  19.             cam.transform.RotateAround(targetObject.transform.position, cam.transform.right, deltaY * -orbitSpeed);
  20.         }
  21.  
  22.         if (Input.GetMouseButton(1))
  23.         {
  24.             float deltaY = Input.GetAxis("Mouse Y");
  25.             cam.transform.position += cam.transform.forward * deltaY;
  26.         }
  27.     }
  28. }

Результат наших трудов


p.s. "Mouse X" и "Mouse Y" это имена осей, который вы можете посмотреть или изменить в меню Edit - Project Settings - Input.

Сообщить о нарушении Подробнее