В УДК есть две основные ветки классов камер:

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...