В UDK уже есть отличная камера от третьего лица. Осталось только заставить ее работать.
Сначала создадим класс своей игры. Назовем ее TPSGame.
Укажем что мы будем использовать свой PlayerController класс, а также свой Pawn класс. Дефолтный UTPawn заточен под игру от первого лица. Ставим значение bDelayedStart в false, чтобы игрок не ждал начала матча. Это нужно для однопользовательских игр.
class TPSGame extends GameInfo;
Quote
defaultproperties
{
bDelayedStart=false;
PlayerControllerClass=class'TPSPlayerController'
DefaultPawnClass=class'TPSPawn'
}
Внимание! после того как мы отнаследовались от GameInfo карты от UT3 скорее всего с нашей игрой работать не будут. Можете попробовать отнаследоваться от UTDeathmatch или UTGame.
Далее нужно изменить настройки в DefaultGame.ini.
Quote
[Engine.GameInfo]
DefaultGame=TPSGame
DefaultServerGame=TPSGame
PlayerControllerClassName=TPSPlayerController
Листинг файла TPSPawn.uc. Тут мы используем стандартные ассеты доступные в UDK для того, чтобы получить 3D модель робота.
Quote
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 в котором мы указываем какой класс камеры использовать для камеры игрока.
Quote
class TPSPlayerController extends GamePlayerController
config(Game);
defaultproperties
{
CameraClass=class'TPSPlayerCamera'
}
Теперь собственно класс игровой камеры TPSPlayerCamera.uc. МетодFindBestCameraType возвращает камеру которую мы хотим использовать.
Quote
class TPSPlayerCamera extends GamePlayerCamera;
protected function GameCameraBase FindBestCameraType(Actor CameraTarget)
{
return ThirdPersonCam;
}
defaultproperties
{
ThirdPersonCameraClass=class'TPSThirdPersonCamera'
}
Листинг TPSThirdPersonCamera.uc. Очень веселый листинг. =o)
Quote
class TPSThirdPersonCamera extends GameThirdPersonCamera;
defaultproperties
{
ThirdPersonCamDefaultClass=class'TPSThirdPersonCameraMode_Default'
}
Ну и наконец последний файл TPSThirdPersonCameraMode_Default.uc.
Quote
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) класс описывающий режим камеры.