Введение
Создание нового игрового проекта и запуска может быть непростой задачей, когда вы впервые начинаете работать с UDK. Вам может быть непонятно, с чего начать, где и т.д. Этот документ предназначен для быстрого выделения важных ключевых аспектов в создании новой игры. По пути вы будете идти путем создания очень простая игра каркаса игры, который затем может быть настроен в соответствии с вашим типом игры.
Настройка проекта
Первое, что необходимо выполнить при запуске новой игры заключается в создании различных папок проекта, которые будут использоваться для хранения скриптов и контента игры. Важно знать, что Unreal Engine предназначен для работы с одним проектом одновременно. Если вы хотите иметь несколько проектов, то лучше работать с несколькими установленными Unreal Development Kit так, как переключение между несколькими проектами в одной инсталляции может быть громоздким и запутанным.
Unreal Script проекта
Любой новый игровой проект, в конечном счете будет использовать Unreal Script создавать собственные классы, чтобы сформировать свою игру. Добавление новых UnrealScripts требует создания пользовательских проектов UnrealScript, которые объединены в новый пакет UnrealScript (.U файла).
Чтобы создать UnrealScript проект, сначала нужно найти каталог ..\Development\Src в папке с установленной версии UDK. Внутри этого каталога, создайте новую папку с любым именем( Обычно это сокращенный вариант названия вашей игры)
В нашем примере будет называться UDNGame .
Внутри этой UDNGame папки,создаем новую папку Classes . Это папка, которая будет содержать скрипты для проекта.
Геймплей классыФайлы нашего примера игры будут почти полностью состоит из нескольких важных классов созданы в UnrealScript. Идея этих классов заключается в создании рабочих скриптов. Мы не строим финальный скрипт который у вас будет намного больше при создании своей игры. Идея состоит в том, чтобы создать проект, который вы сможете использовать в качестве основы для построения своей игры.
Камера
Одним из наиболее важных аспектов любой игре то, как игрок смотрит на мир. В Unreal, положение и ориентацию точки зрения игрока обрабатывается функцией GetPlayerViewPoint () класса PlayerController.
Наш пример будет использовать камеру от третьего лица. Хотя этот пример имеет камеру от третьего лица, любой другой тип камеры может легко реализовать, изменив логику, которая вычисляет положение камеры и вращение.
Руководство Camera Technical Guide представляет собой подробное описание и имеет примеры других реализаций .
Создаем в папке Classes наш первый файл UDNPlayerCamera.uc и в нем пишем скрипт:
class UDNPlayerCamera extends Camera;
var Vector CamOffset;
var float CameraZOffset;
var float CameraScale, CurrentCameraScale; /** множитель по умолчанию расстояние камеры */
var float CameraScaleMin, CameraScaleMax;
function UpdateViewTarget(out TViewTarget OutVT, float DeltaTime)
{
local vector HitLocation, HitNormal;
local CameraActor CamActor;
local Pawn TPawn;
local vector CamStart, CamDirX, CamDirY, CamDirZ, CurrentCamOffset;
local float DesiredCameraZOffset;
// Не обновлять outgoing viewtarget during при интерполяции
if( PendingViewTarget.Target != None && OutVT == ViewTarget && BlendParams.bLockOutgoing )
{
return;
}
// По умолчанию FOV на viewtarget
OutVT.POV.FOV = DefaultFOV;
// Просмотр с помощью камеры актера.
CamActor = CameraActor(OutVT.Target);
if( CamActor != None )
{
CamActor.GetCameraView(DeltaTime, OutVT.POV);
// Захват с соотношением сторон CameraActor.
bConstrainAspectRatio = bConstrainAspectRatio || CamActor.bConstrainAspectRatio;
OutVT.AspectRatio = CamActor.AspectRatio;
// Проверить, если CameraActor хочет изменить настройки, используемые постобработкой.
CamOverridePostProcessAlpha = CamActor.CamOverridePostProcessAlpha;
CamPostProcessSettings = CamActor.CamOverridePostProcess;
}
else
{
TPawn = Pawn(OutVT.Target);
if( TPawn == None || !TPawn.CalcCamera(DeltaTime, OutVT.POV.Location, OutVT.POV.Rotation, OutVT.POV.FOV) )
{
/**************************************
* Расчет третьего лица
**************************************/
OutVT.POV.Rotation = PCOwner.Rotation;
CamStart = TPawn.Location;
CurrentCamOffset = CamOffset;
DesiredCameraZOffset = 1.2 * TPawn.GetCollisionHeight() + TPawn.Mesh.Translation.Z;
CameraZOffset = (DeltaTime < 0.2) ? DesiredCameraZOffset * 5 * DeltaTime + (1 - 5*DeltaTime) * CameraZOffset : DesiredCameraZOffset;
CamStart.Z += CameraZOffset;
GetAxes(OutVT.POV.Rotation, CamDirX, CamDirY, CamDirZ);
CamDirX *= CurrentCameraScale;
TPawn.FindSpot(Tpawn.GetCollisionExtent(),CamStart);
if (CurrentCameraScale < CameraScale)
{
CurrentCameraScale = FMin(CameraScale, CurrentCameraScale + 5 * FMax(CameraScale - CurrentCameraScale, 0.3)*DeltaTime);
}
else if (CurrentCameraScale > CameraScale)
{
CurrentCameraScale = FMax(CameraScale, CurrentCameraScale - 5 * FMax(CameraScale - CurrentCameraScale, 0.3)*DeltaTime);
}
if (CamDirX.Z > TPawn.GetCollisionHeight())
{
CamDirX *= square(cos(OutVT.POV.Rotation.Pitch * 0.0000958738)); // 0.0000958738 = 2*PI/65536
}
OutVT.POV.Location = CamStart - CamDirX*CurrentCamOffset.X + CurrentCamOffset.Y*CamDirY + CurrentCamOffset.Z*CamDirZ;
if (Trace(HitLocation, HitNormal, OutVT.POV.Location, CamStart, false, vect(12,12,12)) != None)
{
OutVT.POV.Location = HitLocation;
}
}
}
ApplyCameraModifiers(DeltaTime, OutVT.POV);
}
defaultproperties
{
CamOffset=(X=12.0,Y=0.0,Z=-13.0)
CurrentCameraScale=1.0
CameraScale=9.0
CameraScaleMin=3.0
CameraScaleMax=40.0
}
PlayerController
Другим основополагающим аспектом любой игры, является управление персоонажем в игре Класс, отвечающий за определение того, как игрок управляет в игре это PlayerController класс.
База PlayerController реализована достаточно, чтобы осуществить вход в игру и перевести его в движение. PlayerController класс, используемый в данном примере это просто присвоение нашему UDNPlayerCamera классу , созданному выше. Конечно, во время создания вашей игры вам будет необходимо внести изменения в этот класс, чтобы добавить логику необходимую для конкретной реализации вашей игры.
Создаем файл UDNPlayerController.uc
class UDNPlayerController extends GamePlayerController;
defaultproperties
{
CameraClass=class'UDNGame.UDNPlayerCamera'
}
Characters Technical Guide дает подробное объяснение по PlayerController класс, как настроить его в соответствии с новыми типами игр.
Pawn
В то время как PlayerController класс используется для управления игрой, которая в данном случае будет включать в себя непосредственное управление , то наглядное представление о логике для определения того, как он взаимодействует с физическим миром заключена в Pawn классе. Pawn класс в этом примере не будет добовлять особой логики для взаимодействия с окружающей средой, но он будет отвечать за создание визуального представления. Это означает, что необходимо установить скелетной сетки, анимация и физика активов, которые будут использоваться для отображения персонажа в игре.
Characters Technical Guide дает подробное объяснение классу и как он работает в тандеме с PlayerController классом.
Создаем файл UDNPawn.uc
class UDNPawn extends Pawn;
var DynamicLightEnvironmentComponent LightEnvironment;
defaultproperties
{
WalkingPct=+0.4
CrouchedPct=+0.4
BaseEyeHeight=38.0
EyeHeight=38.0
GroundSpeed=440.0
AirSpeed=440.0
WaterSpeed=220.0
AccelRate=2048.0
JumpZ=322.0
CrouchHeight=29.0
CrouchRadius=21.0
WalkableFloorZ=0.78
Components.Remove(Sprite)
Begin Object Class=DynamicLightEnvironmentComponent Name=MyLightEnvironment
bSynthesizeSHLight=TRUE
bIsCharacterLightEnvironment=TRUE
bUseBooleanEnvironmentShadowing=FALSE
End Object
Components.Add(MyLightEnvironment)
LightEnvironment=MyLightEnvironment
Begin Object Class=SkeletalMeshComponent Name=WPawnSkeletalMeshComponent
//Ваш Свойства Mesh
SkeletalMesh=SkeletalMesh'CH_LIAM_Cathode.Mesh.SK_CH_LIAM_Cathode'
AnimTreeTemplate=AnimTree'CH_AnimHuman_Tree.AT_CH_Human'
PhysicsAsset=PhysicsAsset'CH_AnimCorrupt.Mesh.SK_CH_Corrupt_Male_Physics'
AnimSets(0)=AnimSet'CH_AnimHuman.Anims.K_AnimHuman_BaseMale'
Translation=(Z=8.0)
Scale=1.075
//Общие свойства Mesh
bCacheAnimSequenceNodes=FALSE
AlwaysLoadOnClient=true
AlwaysLoadOnServer=true
bOwnerNoSee=false
CastShadow=true
BlockRigidBody=TRUE
bUpdateSkelWhenNotRendered=false
bIgnoreControllersWhenNotRendered=TRUE
bUpdateKinematicBonesFromAnimation=true
bCastDynamicShadow=true
RBChannel=RBCC_Untitled3
RBCollideWithChannels=(Untitled3=true)
LightEnvironment=MyLightEnvironment
bOverrideAttachmentOwnerVisibility=true
bAcceptsDynamicDecals=FALSE
bHasPhysicsAssetInstance=true
TickGroup=TG_PreAsyncWork
MinDistFactorForKinematicUpdate=0.2
bChartDistanceFactor=true
RBDominanceGroup=20
bUseOnePassLightingOnTranslucency=TRUE
bPerBoneMotionBlur=true
End Object
Mesh=WPawnSkeletalMeshComponent
Components.Add(WPawnSkeletalMeshComponent)
Begin Object Name=CollisionCylinder
CollisionRadius=+0021.000000
CollisionHeight=+0044.000000
End Object
CylinderComponent=CollisionCylinder
}
HUD
HUD класс отвечает за отображение информации об игре игроку.
HUD Technical Guide предоставляет подробную информацию о создании HUD с использованием как Canvas так и Scaleform GFX интеграция в Unreal Engine 3.
Создаем файл UDNHUD.uc
class UDNHUD extends MobileHUD;
defaultproperties
{
}
Gametype
Gametype является основой игры. Он определяет правила игры и условия. Ясно, что это полностью игра от конкретных условий. Gametype также несет ответственность за сообщающей, какие классы использовать для PlayerControllers, Pawns, HUD, и т.д.
Gametype Technical Guide более подробно о Gametype
Создаем файл UDNGame.uc
class UDNGame extends FrameworkGame;
defaultproperties
{
PlayerControllerClass=class'UDNGame.UDNPlayerController'
DefaultPawnClass=class'UDNGame.UDNPawn'
HUDType=class'UDNGame.UDNHUD'
bDelayedStart=false
}
Перед тем ка компилировать наши новые скрипты нам нужно добавить их. Для этого открываем файл DefaultEngine.ini в ....\UDKGame\Config ищем там:
[UnrealEd.EditorEngine]
+EditPackages=UTGame
+EditPackages=UTGameContent
и добовляем там свою строчку +EditPackages=UDNGame. должно получится так.
[UnrealEd.EditorEngine]
+EditPackages=UTGame
+EditPackages=UTGameContent
+EditPackages=UDNGame
Компилируем через UnrealFrontend входящий в комплект UDK.
Тестим
Запускаем UDK Editor и заходим в View>>>World Properties
И выбераем наш тип игры UDNGame из списка доступных типов игры.
Теперь все скрипты которые находятся в нашей папке UDNGame будут задействованы в нашем типе игры
Скачать файлы
Статья является переводом и правообладание на интеллектуальную собственность принадлежат Epic Games, Inc. Использование статьи возможно только с указанием сайта первоисточника и сайта переводчика rusudk.ru
Создание нового игрового проекта и запуска может быть непростой задачей, когда вы впервые начинаете работать с UDK. Вам может быть непонятно, с чего начать, где и т.д. Этот документ предназначен для быстрого выделения важных ключевых аспектов в создании новой игры. По пути вы будете идти путем создания очень простая игра каркаса игры, который затем может быть настроен в соответствии с вашим типом игры.
Настройка проекта
Первое, что необходимо выполнить при запуске новой игры заключается в создании различных папок проекта, которые будут использоваться для хранения скриптов и контента игры. Важно знать, что Unreal Engine предназначен для работы с одним проектом одновременно. Если вы хотите иметь несколько проектов, то лучше работать с несколькими установленными Unreal Development Kit так, как переключение между несколькими проектами в одной инсталляции может быть громоздким и запутанным.
Unreal Script проекта
Любой новый игровой проект, в конечном счете будет использовать Unreal Script создавать собственные классы, чтобы сформировать свою игру. Добавление новых UnrealScripts требует создания пользовательских проектов UnrealScript, которые объединены в новый пакет UnrealScript (.U файла).
Чтобы создать UnrealScript проект, сначала нужно найти каталог ..\Development\Src в папке с установленной версии UDK. Внутри этого каталога, создайте новую папку с любым именем( Обычно это сокращенный вариант названия вашей игры)
В нашем примере будет называться UDNGame .
Внутри этой UDNGame папки,создаем новую папку Classes . Это папка, которая будет содержать скрипты для проекта.
Геймплей классыФайлы нашего примера игры будут почти полностью состоит из нескольких важных классов созданы в UnrealScript. Идея этих классов заключается в создании рабочих скриптов. Мы не строим финальный скрипт который у вас будет намного больше при создании своей игры. Идея состоит в том, чтобы создать проект, который вы сможете использовать в качестве основы для построения своей игры.
Камера
Одним из наиболее важных аспектов любой игре то, как игрок смотрит на мир. В Unreal, положение и ориентацию точки зрения игрока обрабатывается функцией GetPlayerViewPoint () класса PlayerController.
Наш пример будет использовать камеру от третьего лица. Хотя этот пример имеет камеру от третьего лица, любой другой тип камеры может легко реализовать, изменив логику, которая вычисляет положение камеры и вращение.
Руководство Camera Technical Guide представляет собой подробное описание и имеет примеры других реализаций .
Создаем в папке Classes наш первый файл UDNPlayerCamera.uc и в нем пишем скрипт:
class UDNPlayerCamera extends Camera;
var Vector CamOffset;
var float CameraZOffset;
var float CameraScale, CurrentCameraScale; /** множитель по умолчанию расстояние камеры */
var float CameraScaleMin, CameraScaleMax;
function UpdateViewTarget(out TViewTarget OutVT, float DeltaTime)
{
local vector HitLocation, HitNormal;
local CameraActor CamActor;
local Pawn TPawn;
local vector CamStart, CamDirX, CamDirY, CamDirZ, CurrentCamOffset;
local float DesiredCameraZOffset;
// Не обновлять outgoing viewtarget during при интерполяции
if( PendingViewTarget.Target != None && OutVT == ViewTarget && BlendParams.bLockOutgoing )
{
return;
}
// По умолчанию FOV на viewtarget
OutVT.POV.FOV = DefaultFOV;
// Просмотр с помощью камеры актера.
CamActor = CameraActor(OutVT.Target);
if( CamActor != None )
{
CamActor.GetCameraView(DeltaTime, OutVT.POV);
// Захват с соотношением сторон CameraActor.
bConstrainAspectRatio = bConstrainAspectRatio || CamActor.bConstrainAspectRatio;
OutVT.AspectRatio = CamActor.AspectRatio;
// Проверить, если CameraActor хочет изменить настройки, используемые постобработкой.
CamOverridePostProcessAlpha = CamActor.CamOverridePostProcessAlpha;
CamPostProcessSettings = CamActor.CamOverridePostProcess;
}
else
{
TPawn = Pawn(OutVT.Target);
if( TPawn == None || !TPawn.CalcCamera(DeltaTime, OutVT.POV.Location, OutVT.POV.Rotation, OutVT.POV.FOV) )
{
/**************************************
* Расчет третьего лица
**************************************/
OutVT.POV.Rotation = PCOwner.Rotation;
CamStart = TPawn.Location;
CurrentCamOffset = CamOffset;
DesiredCameraZOffset = 1.2 * TPawn.GetCollisionHeight() + TPawn.Mesh.Translation.Z;
CameraZOffset = (DeltaTime < 0.2) ? DesiredCameraZOffset * 5 * DeltaTime + (1 - 5*DeltaTime) * CameraZOffset : DesiredCameraZOffset;
CamStart.Z += CameraZOffset;
GetAxes(OutVT.POV.Rotation, CamDirX, CamDirY, CamDirZ);
CamDirX *= CurrentCameraScale;
TPawn.FindSpot(Tpawn.GetCollisionExtent(),CamStart);
if (CurrentCameraScale < CameraScale)
{
CurrentCameraScale = FMin(CameraScale, CurrentCameraScale + 5 * FMax(CameraScale - CurrentCameraScale, 0.3)*DeltaTime);
}
else if (CurrentCameraScale > CameraScale)
{
CurrentCameraScale = FMax(CameraScale, CurrentCameraScale - 5 * FMax(CameraScale - CurrentCameraScale, 0.3)*DeltaTime);
}
if (CamDirX.Z > TPawn.GetCollisionHeight())
{
CamDirX *= square(cos(OutVT.POV.Rotation.Pitch * 0.0000958738)); // 0.0000958738 = 2*PI/65536
}
OutVT.POV.Location = CamStart - CamDirX*CurrentCamOffset.X + CurrentCamOffset.Y*CamDirY + CurrentCamOffset.Z*CamDirZ;
if (Trace(HitLocation, HitNormal, OutVT.POV.Location, CamStart, false, vect(12,12,12)) != None)
{
OutVT.POV.Location = HitLocation;
}
}
}
ApplyCameraModifiers(DeltaTime, OutVT.POV);
}
defaultproperties
{
CamOffset=(X=12.0,Y=0.0,Z=-13.0)
CurrentCameraScale=1.0
CameraScale=9.0
CameraScaleMin=3.0
CameraScaleMax=40.0
}
PlayerController
Другим основополагающим аспектом любой игры, является управление персоонажем в игре Класс, отвечающий за определение того, как игрок управляет в игре это PlayerController класс.
База PlayerController реализована достаточно, чтобы осуществить вход в игру и перевести его в движение. PlayerController класс, используемый в данном примере это просто присвоение нашему UDNPlayerCamera классу , созданному выше. Конечно, во время создания вашей игры вам будет необходимо внести изменения в этот класс, чтобы добавить логику необходимую для конкретной реализации вашей игры.
Создаем файл UDNPlayerController.uc
class UDNPlayerController extends GamePlayerController;
defaultproperties
{
CameraClass=class'UDNGame.UDNPlayerCamera'
}
Characters Technical Guide дает подробное объяснение по PlayerController класс, как настроить его в соответствии с новыми типами игр.
Pawn
В то время как PlayerController класс используется для управления игрой, которая в данном случае будет включать в себя непосредственное управление , то наглядное представление о логике для определения того, как он взаимодействует с физическим миром заключена в Pawn классе. Pawn класс в этом примере не будет добовлять особой логики для взаимодействия с окружающей средой, но он будет отвечать за создание визуального представления. Это означает, что необходимо установить скелетной сетки, анимация и физика активов, которые будут использоваться для отображения персонажа в игре.
Characters Technical Guide дает подробное объяснение классу и как он работает в тандеме с PlayerController классом.
Создаем файл UDNPawn.uc
class UDNPawn extends Pawn;
var DynamicLightEnvironmentComponent LightEnvironment;
defaultproperties
{
WalkingPct=+0.4
CrouchedPct=+0.4
BaseEyeHeight=38.0
EyeHeight=38.0
GroundSpeed=440.0
AirSpeed=440.0
WaterSpeed=220.0
AccelRate=2048.0
JumpZ=322.0
CrouchHeight=29.0
CrouchRadius=21.0
WalkableFloorZ=0.78
Components.Remove(Sprite)
Begin Object Class=DynamicLightEnvironmentComponent Name=MyLightEnvironment
bSynthesizeSHLight=TRUE
bIsCharacterLightEnvironment=TRUE
bUseBooleanEnvironmentShadowing=FALSE
End Object
Components.Add(MyLightEnvironment)
LightEnvironment=MyLightEnvironment
Begin Object Class=SkeletalMeshComponent Name=WPawnSkeletalMeshComponent
//Ваш Свойства Mesh
SkeletalMesh=SkeletalMesh'CH_LIAM_Cathode.Mesh.SK_CH_LIAM_Cathode'
AnimTreeTemplate=AnimTree'CH_AnimHuman_Tree.AT_CH_Human'
PhysicsAsset=PhysicsAsset'CH_AnimCorrupt.Mesh.SK_CH_Corrupt_Male_Physics'
AnimSets(0)=AnimSet'CH_AnimHuman.Anims.K_AnimHuman_BaseMale'
Translation=(Z=8.0)
Scale=1.075
//Общие свойства Mesh
bCacheAnimSequenceNodes=FALSE
AlwaysLoadOnClient=true
AlwaysLoadOnServer=true
bOwnerNoSee=false
CastShadow=true
BlockRigidBody=TRUE
bUpdateSkelWhenNotRendered=false
bIgnoreControllersWhenNotRendered=TRUE
bUpdateKinematicBonesFromAnimation=true
bCastDynamicShadow=true
RBChannel=RBCC_Untitled3
RBCollideWithChannels=(Untitled3=true)
LightEnvironment=MyLightEnvironment
bOverrideAttachmentOwnerVisibility=true
bAcceptsDynamicDecals=FALSE
bHasPhysicsAssetInstance=true
TickGroup=TG_PreAsyncWork
MinDistFactorForKinematicUpdate=0.2
bChartDistanceFactor=true
RBDominanceGroup=20
bUseOnePassLightingOnTranslucency=TRUE
bPerBoneMotionBlur=true
End Object
Mesh=WPawnSkeletalMeshComponent
Components.Add(WPawnSkeletalMeshComponent)
Begin Object Name=CollisionCylinder
CollisionRadius=+0021.000000
CollisionHeight=+0044.000000
End Object
CylinderComponent=CollisionCylinder
}
HUD
HUD класс отвечает за отображение информации об игре игроку.
HUD Technical Guide предоставляет подробную информацию о создании HUD с использованием как Canvas так и Scaleform GFX интеграция в Unreal Engine 3.
Создаем файл UDNHUD.uc
class UDNHUD extends MobileHUD;
defaultproperties
{
}
Gametype
Gametype является основой игры. Он определяет правила игры и условия. Ясно, что это полностью игра от конкретных условий. Gametype также несет ответственность за сообщающей, какие классы использовать для PlayerControllers, Pawns, HUD, и т.д.
Gametype Technical Guide более подробно о Gametype
Создаем файл UDNGame.uc
class UDNGame extends FrameworkGame;
defaultproperties
{
PlayerControllerClass=class'UDNGame.UDNPlayerController'
DefaultPawnClass=class'UDNGame.UDNPawn'
HUDType=class'UDNGame.UDNHUD'
bDelayedStart=false
}
Перед тем ка компилировать наши новые скрипты нам нужно добавить их. Для этого открываем файл DefaultEngine.ini в ....\UDKGame\Config ищем там:
[UnrealEd.EditorEngine]
+EditPackages=UTGame
+EditPackages=UTGameContent
и добовляем там свою строчку +EditPackages=UDNGame. должно получится так.
[UnrealEd.EditorEngine]
+EditPackages=UTGame
+EditPackages=UTGameContent
+EditPackages=UDNGame
Компилируем через UnrealFrontend входящий в комплект UDK.
Тестим
Запускаем UDK Editor и заходим в View>>>World Properties
И выбераем наш тип игры UDNGame из списка доступных типов игры.
Теперь все скрипты которые находятся в нашей папке UDNGame будут задействованы в нашем типе игры
Скачать файлы
Статья является переводом и правообладание на интеллектуальную собственность принадлежат Epic Games, Inc. Использование статьи возможно только с указанием сайта первоисточника и сайта переводчика rusudk.ru
Комментариев нет:
Отправить комментарий
Примечание. Отправлять комментарии могут только участники этого блога.