Камеры в УДК |
В УДК есть две основные ветки классов камер:
Camera -> GamePlayerCamera -> ВашаКамера
GameCameraBase -> GameThirdPersonCamera/GameFixedCamera -> Ваши реализации камер от третьего лица и фиксированной.
и одна дополнительная:
GameThirdPersonCameraMode -> GameThirdPersonCameraMode_Default -> Ваша камера. В них просто уточняются характеристики камеры.
Есть еще класс CameraActor, представляющий физическое воплощение камеры в мире.
Остальные классы связанные с камерами - служебные, представляют анимацию камеры и т.п.
Где происходит перемещение камеры, настройка фокуса и т.п.
В GamePlayerCamera есть функция UpdateViewTarget. Там кроме прочего вызывается CurrentCamera.UpdateCamera. CurrentCamera изначально GameThirdPersonCamera (или Fixed).
Функция UpdateCamera в нем кроме прочего вызывает PlayerUpdateCamera. В GameThirdPersonCamera PlayerUpdateCamera пустая.Также UpdateCamera вызывает Pawn.CalcCamera. При использовании UTPawn все рассчеты производятся именно там. Что не очень удобно.
Какой нормальный процесс. Создаем класс производный от GameThirdPersonCamera (RPGTPS). В нем определяем UpdateCamera. Там просто переписываем все из GameThirdPersonCamera для вызова нашей PlayerUpdateCamera, которую тоже определяем в RPGTPS. Так приходится делать, т.к. UpdateCamera не виртуальная (можно попробовать переписать GameThirdPersonCamera - сделать UpdateCamera виртуальной, тогда ее не нужно будет снова писать в нашем классе. Тогда придется и в GameCameraBase). В PlayerUpdateCamera производим все нужные нам рассчеты.
Однако все рассчеты удобнее проводить не в RPGTPS, а в классе производном от GamePlayerCamera. Почему? Потому что там есть многие нужные для рассчета переменные, которые, конечно можно достать и в RPGTPS, но это куча лишних вызовов... Поэтому в RPGTPS делаем простую "затычку", типа:
protected function PlayerUpdateCamera(Pawn P, GamePlayerCamera CameraAct, float DeltaTime, out TViewTarget OutVT)
{
RPGPlayerCamera(PlayerCamera).UpdateThirdPCamera(P, CameraAct, DeltaTime, OutVT);
}
PlayerCamera - типа GamePlayerCamera, поэтому приходится преобразовывать к нашему типу. UpdateThirdPCamera - функция в RPGPlayerCamera, в которой и проводим все расчеты...
Внимание!
В GamePlayerCamera есть ошибка. В:
protected function GameCameraBase FindBestCameraType(Actor CameraTarget)
нужно вместо:
if (CameraStyle == 'default')
Сделать
if (CameraStyle != 'default')
Иначе она будет возвращать None...
Комментировать | « Пред. запись — К дневнику — След. запись » | Страницы: [1] [Новые] |