КАК СДЕЛАТЬ ОБЛЁТ КАМЕРОЙ ВОКРУГ ОБЪЕКТА
Создайте на сцене простой объект-цель куб и приблизьте к нему дефолтную камеру поближе, если она вдруг очень далеко.
Создаём единственный скрипт, который будет контролировать нашу идею и соответственно он должен иметь ссылки на камеру и на объект в сцене. Плюс добавим свойство для скорости движения камеры, ведь она может вращаться как быстро, так и медленно.
using
UnityEngine;
public
class
CameraOrbit : MonoBehaviour
{
-
public
Camera cam;
-
public
Transform targetObject;
-
public
float
orbitSpeed = 10f;
}
Вы можете повесить этот скрипт на любой объект в сцене.
Перетащите в поле cam вашу камеру, а в поле targetObject объект-цель со сцены. Скорость пока можете не менять, вдруг она подойдёт.
Все движения камеры будем обрабатывать в Update и так как ваш объект может двигаться, сделаем так, чтобы камера автоматически изначально нацеливалась на него.
using
UnityEngine;
public
class
CameraOrbit : MonoBehaviour
{
-
public
Camera cam;
-
public
Transform targetObject;
-
public
float
orbitSpeed = 10f;
-
void
Update()
-
{
-
cam.transform.LookAt(targetObject, Vector3.up);
-
}
}
Сначала сделаем так, чтобы при зажатии ЛКМ и движении, камера крутилась вокруг объекта по оси Y (как будто водим хоровод вокруг ёлочки в детском садике). Для этого ловим само зажатие и узнаём - насколько сдвинулась мышь по X на экране и крутим камеру с нашей скоростью.
void
Update()
{
-
cam.transform.LookAt(targetObject, Vector3.up);
-
if
(Input.GetMouseButton(0))
-
{
-
float
deltaX = Input.GetAxis(
"Mouse X"
);
-
cam.transform.RotateAround(targetObject.transform.position, Vector3.up, deltaX * orbitSpeed);
-
}
}
Метод RotateAround в данном случае принимает следующие параметры:
- центр, вокруг которого будет кручение
- ось по которой будет кручение
- угол на который прокрутить объект
Это должно выглядеть как-то так
Теперь так же добавим кручение камерой вверх и вниз, чтобы можно было посмотреть на лысину объекта или подсмотреть снизу на Лару Крофт. Для этого уже будем ловить сдвиг мыши по Y и вертеть камеру относительно её собственной оси X.
void
Update()
{
-
cam.transform.LookAt(targetObject, Vector3.up);
-
if
(Input.GetMouseButton(0))
-
{
-
float
deltaX = Input.GetAxis(
"Mouse X"
);
-
float
deltaY = Input.GetAxis(
"Mouse Y"
);
-
cam.transform.RotateAround(targetObject.transform.position, Vector3.up, deltaX * orbitSpeed);
-
cam.transform.RotateAround(targetObject.transform.position, cam.transform.right, deltaY * -orbitSpeed);
-
}
}
Сейчас уже можно облететь объект со всех сторон
Но конечно же хочется иметь возможность приближаться и отдалятся. Для этого уже будем использовать ПКМ. Добавьте ещё пару строчек и весь код выглядит таким образом:
using
UnityEngine;
public
class
CameraOrbit : MonoBehaviour
{
-
public
Camera cam;
-
public
Transform targetObject;
-
public
float
orbitSpeed = 10f;
-
void
Update()
-
{
-
cam.transform.LookAt(targetObject, Vector3.up);
-
if
(Input.GetMouseButton(0))
-
{
-
float
deltaX = Input.GetAxis(
"Mouse X"
);
-
float
deltaY = Input.GetAxis(
"Mouse Y"
);
-
cam.transform.RotateAround(targetObject.transform.position, Vector3.up, deltaX * orbitSpeed);
-
cam.transform.RotateAround(targetObject.transform.position, cam.transform.right, deltaY * -orbitSpeed);
-
}
-
if
(Input.GetMouseButton(1))
-
{
-
float
deltaY = Input.GetAxis(
"Mouse Y"
);
-
cam.transform.position += cam.transform.forward * deltaY;
-
}
-
}
}
Результат наших трудов
p.s. "Mouse X" и "Mouse Y" это имена осей, который вы можете посмотреть или изменить в меню Edit - Project Settings - Input.