суббота, 7 ноября 2009 г.

Камера от третьего лица в UDK

В UDK уже есть отличная камера от третьего лица. Осталось только заставить ее работать.

Сначала создадим класс своей игры. Назовем ее TPSGame.
Укажем что мы будем использовать свой PlayerController класс, а также свой Pawn класс. Дефолтный UTPawn заточен под игру от первого лица. Ставим значение bDelayedStart в false, чтобы игрок не ждал начала матча. Это нужно для однопользовательских игр.
class TPSGame extends GameInfo;

defaultproperties
{
  bDelayedStart=false;
  PlayerControllerClass=class'TPSPlayerController'
  DefaultPawnClass=class'TPSPawn'
}
Внимание! после того как мы отнаследовались от GameInfo карты от UT3 скорее всего с нашей игрой работать не будут. Можете попробовать отнаследоваться от UTDeathmatch или UTGame.

Далее нужно изменить настройки в DefaultGame.ini.
[Engine.GameInfo]
DefaultGame=TPSGame
DefaultServerGame=TPSGame
PlayerControllerClassName=TPSPlayerController
Листинг файла TPSPawn.uc. Тут мы используем стандартные ассеты доступные в UDK для того, чтобы получить 3D модель робота.
class TPSPawn extends GamePawn
  config(Game);

simulated function name GetDefaultCameraMode( PlayerController RequestedBy )
{
  return 'ThirdPerson';
}

defaultproperties
{
  Components.Remove(Sprite)
  Begin Object Class=DynamicLightEnvironmentComponent Name=MyLightEnvironment
    ModShadowFadeoutTime=0.25
    MinTimeBetweenFullUpdates=0.25
    AmbientGlow=(R=.01,G=.01,B=.03,A=1)
    AmbientShadowColor=(R=0.10,G=0.10,B=0.10)
    LightShadowMode=LightShadow_ModulateBetter
    ShadowFilterQuality=SFQ_High
    bSynthesizeSHLight=TRUE
  End Object
  Components.Add(MyLightEnvironment)

  Begin Object Class=SkeletalMeshComponent Name=InitialSkeletalMesh
    CastShadow=true
    bCastDynamicShadow=true
    bOwnerNoSee=false
    LightEnvironment=MyLightEnvironment;
    BlockRigidBody=true;
    CollideActors=true;
    BlockZeroExtent=true;
    PhysicsAsset=PhysicsAsset'CH_AnimCorrupt.Mesh.SK_CH_Corrupt_Male_Physics'
    AnimSets(0)=AnimSet'CH_AnimHuman.Anims.K_AnimHuman_AimOffset'
    AnimSets(1)=AnimSet'CH_AnimHuman.Anims.K_AnimHuman_BaseMale'
    AnimTreeTemplate=AnimTree'CH_AnimHuman_Tree.AT_CH_Human'
    SkeletalMesh=SkeletalMesh'CH_LIAM_Cathode.Mesh.SK_CH_LIAM_Cathode'
  End Object

  Mesh=InitialSkeletalMesh;
  Components.Add(InitialSkeletalMesh);
}
Наконец файл TPSPlayerController.uc в котором мы указываем какой класс камеры использовать для камеры игрока.
class TPSPlayerController extends GamePlayerController
  config(Game);

defaultproperties
{
  CameraClass=class'TPSPlayerCamera'
}
Теперь собственно класс игровой камеры TPSPlayerCamera.uc. Метод FindBestCameraType возвращает камеру которую мы хотим использовать.
class TPSPlayerCamera extends GamePlayerCamera;

protected function GameCameraBase FindBestCameraType(Actor CameraTarget)
{
  return ThirdPersonCam;
}

defaultproperties
{
  ThirdPersonCameraClass=class'TPSThirdPersonCamera'
}
Листинг TPSThirdPersonCamera.uc. Очень веселый листинг. =)
class TPSThirdPersonCamera extends GameThirdPersonCamera;

defaultproperties
{
  ThirdPersonCamDefaultClass=class'TPSThirdPersonCameraMode_Default'
}
Ну и наконец последний файл TPSThirdPersonCameraMode_Default.uc.
class TPSThirdPersonCameraMode_Default extends GameThirdPersonCameraMode_Default;

var float FOV;

function float GetDesiredFOV( Pawn ViewedPawn )
{
  return FOV;
}

defaultproperties
{
  FOV=80.f;
  PawnRelativeOffset=(x=30,y=10,z=-40)
  BlendTime=0.3
}
Компилим, запускаем и радуемся.

Итак вкратце:
  • PlayerCamera это всего лишь обертка содержащая в себе все возможные типы камер которые у вас будут использоваться. В методе FindBestCameraType вы сможете выбирать тип камеры который нужно использовать в данный момент.
  • GameCameraBase (в нашем случае GameThirdPersonCamera) это и есть класс описывающий функциональность камеры. Каждый тип камеры может иметь несколько режимов.
  • GameThirdPersonCameraMode (в нашем случае GameThirdPersonCameraMode_Default) класс описывающий режим камеры.

23 комментария:

eof комментирует...

Спасибо!

Geniy комментирует...

Интересная статейка. А нет ли желания перевести например вот это
udn.epicgames.com/Three/MaterialsTutorial.html

или ещё какую-нибудь статейку отсюда
udn.epicgames.com/Three/UDKContentCreationHome.html

Там очень много терминов... Сложно понять многое...

Newman комментирует...

Переводить нет никакого желания. Незнание английского (хотя бы технического, который не так сложен как кажется) рано или поздно заведет в тупик. Я учил английский очень просто - садился и заставлял себя читать английские тескты со словарем 2-3 часа в день. А сейчас есть Google Translate. =)

Sater комментирует...

Привет. Только начал изучать UDK. Не совсем понятно как начать проект под single player. На оффе не могу разобраться что куда прописывать. Не подскажешь?

Newman комментирует...

Single Player отличается от Multi Player только разными игровыми правилами. Смотри начало статьи там где создается TPSGame и TPSPlayerController.

Nimphomaniake комментирует...

я когда все зделал и запускаю в едиторе левел то камера просто летает по уровню(((
а в игре вообще ничего неизменилось(((
что зделать?
может я делаю ошыбку при компилировании???

Newman комментирует...

Попробуй запускать свою карту не из эдитора.

Nimphomaniake комментирует...

ксли не из едитора то никаких изминений нет((((
все как было!

Newman комментирует...

Буду дома, еще раз перепроверю. Я тут вносил небольшие изменения.

Nimphomaniake комментирует...

ок!

Nimphomaniake комментирует...

ну как там?
проверил?
у тебя работает?

Newman комментирует...

Да. Все работает.

Unknown комментирует...

А откуда это? Это перевод?

Unknown комментирует...

спасибо, очень интересно и позновательно, а нет ли желанеия использовать видеоматериал) ну тобто делать видео уроки!

Newman комментирует...

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

Unknown комментирует...

Camtasia Studio

"Программа для создания презентаций и интерактивных обучающих видеоуроков. Camtasia Studio может осуществлять захват изображения экрана и сохранять эту информацию в видеофайл. Весь процесс записи происходит в режиме реального времени. Для максимального удобства в программе есть возможность создание интерактивного оглавления. С помощью Camtasia Studio можно создавать интерактивные файлы справки, проводить демонстрацию новых возможностей программ, записывать демонстрационные ролики приложений, компьютерных игр и т.д."

Рекомендую

Хотелось бы увидеть уроки по созданию уровня с нуля, по изменению стандартного UI

Newman комментирует...

Я программер и по левел дизайну уроки не осилю. =)

Unknown комментирует...

У меня таже проблема .. камера летает как в режиме спектратора и даже HUD не рисуется .. уже и над ини файлами издевался .. таже фегня .. думаю камера таки изменилась а вот модель робата ..

Unknown комментирует...

Newman, нам как раз программера не хватает, не хотите ли поделиться опытом тут unreal-level.ru?

Alex Winner комментирует...

Неработает камера просто летает поуровню, всё сделал как в статейке

Alex Winner комментирует...

Вот на сайте игры The Ball есть скрипты для камеры от 3 лица но в них ошибка, при нажатии в игре "F" робот падает потом жмём оптять F он вообще изчезает оно ток оружие видно

Серый комментирует...

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

3umfator комментирует...

Здраствуйте! Спасибо за туториал! Я так понял
"PawnRelativeOffset=(x=30,y=10,z=-40)"
это Ваша собственная функция, и я хочу попросить Вас поподробней рассказать о ней, а то не получается от центровать положение камеры.