Задача: использовать Cinemachine и C# для создания интерактивной системы видеонаблюдения.

Во-первых, я собираюсь создать псевдокоридор и создать коробку в центре, которая будет представлять операционную систему камер для взаимодействия с камерами.

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

Затем я добавлю несколько разных виртуальных камер, чтобы мы могли переключаться между разными углами камеры.

Далее мы можем создать игровой объект и назовем его CameraManager. Давайте продолжим, откроем этот скрипт и добавим пространство имен Cinemachine. Затем мы можем добавить массив и сериализовать его, чтобы добавить в него наши камеры и получить доступ ко всем из них через этот массив.

Я также собираюсь создать закрытую переменную типа int, о которой я расскажу позже, но это будет камера, которая будет выбрана.

Перетащите все свои камеры в массив, включая камеру от третьего лица, которая будет камерой по умолчанию.

Теперь мы создадим один метод, который установит для всех наших камер приоритет 10. И мы создадим метод, который установит для главной камеры приоритет 10. 15. Это будет используемая камера.

Мы будем делать то же самое, что и в моей предыдущей статье, за исключением того, что у нас есть смешанная камера в этом массиве, и мы должны сделать что-то немного другое. Мне просто нужно получить компонент для смешанной камеры, а также для виртуальных камер.

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

Таким образом, это, по сути, означает, что если это виртуальная камера и камера со смешанным списком, установите приоритет на 10.

Я немного подчищу это с помощью TryGetComponent.

TryGetComponent будет использоваться в качестве bool. Вот как это пишет:
TryGetComponent попытается получить компонент CinemachineVirtualCameraиз cam, и это доступен и возвращает значение true, то он выводит локальную переменную virtualCam, которая является компонентом CinemachineVirtualCamera.

Если виртуальная камера недоступна (нулевая), она будет ложной. Если virtualCam доступна, она переместится вперед и установит для virtualCam приоритет 10. Затем, если виртуальной камеры нет, она переместится на else оператор и проверьте камеру наложения. Я не могу сделать то же самое с TryGetComponent здесь, если только я не создам два оператора if.

Затем я сделаю что-то очень похожее с моим методом SelectCurrentCamera и вставлю переменную currentCamera в скобку массива.

Я также уберу это с помощью TryGetComponent.

Теперь мы можем создать метод с локальной переменной в скобках для работы переменной currentCamera.

Теперь я могу использовать все это и активировать систему камер безопасности с помощью моего ввода.

Я создам Input.GetKeyDown, и у меня будет так, что каждый раз, когда нажимается буква 'C', значение камеры будет сбрасываться, и оно будет устанавливать currentCamera увеличить на 1, тем самым увеличив значение через cameraArray.

Проблема, с которой мы здесь столкнемся, заключается в том, что currentCamera будет добавляться бесконечно. Нам нужно создать оператор if, чтобы вручную сбросить наш счетчик currentCamera до 1, если он превышает значение внутри массива.

Теперь это работает отлично. Однако на данный момент мы можем нажать «C» в любой момент игры, и это изменит камеры. Я хотел, чтобы это работало только тогда, когда игрок находится на спусковом крючке.

Чтобы решить эту проблему, я создам bool в сценарии CameraManager и вызову его в сценарии триггера.

Далее я собираюсь создать скрипт CameraTrigger для моего триггерного блока, который я сделал ранее.

В этом сценарии я собираюсь создать сценарий OnTriggerEnter и проверить, касается ли игрок этого триггера, после чего я могу инициализировать свой CameraManagerскрипт.

Во-первых, я хочу сериализовать переменную CameraManager в сценарии CameraTrigger.

Затем я могу перетащить объект диспетчера камер в это сериализованное поле в инспекторе.

Теперь давайте создадим нашу функцию OnTriggerEnter.

Теперь, когда игрокнажимает на этот триггер, для currentCamera устанавливается значение 0.

Итак, я привнес это в свой сценарий триггера, а также создал OnTriggerExit.

Итак, теперь для bool будет установлено значение true, если игрок касается триггера, и false, если игрок уходит. триггер. Это также вернет текущую камеру к исходной камере (которая равна 0), сбросит приоритеты на 10 и сделает приоритет основной камеры равным 15. По сути, это вернет все к тому, что было до входа. курок.

Наконец, я хочу, чтобы моя камера сразу возвращалась к игроку, а не переходила медленно. Чтобы исправить это, я пойду в Основная камера CinemachineBrain и изменю Blend на Cut.

Теперь все должно работать отлично! Я сделаю скриншоты обоих своих скриптов, чтобы было легче следить за ними.

Скрипт диспетчера камеры

Сценарий запуска камеры