资源描述
UDK入门教程--第一章:第一节 建立一个空工程-上
第一步:
首先,我们从主页下载最新版(此文以UDK-2010-01版为例)
安装完成后,我们找到UDK-2010-01文件夹,对其复制粘贴创建一个副本,将目录名改成你喜欢的名字,比如我创建为KingdomWorld,以后文章都以KingdomWorld为例。
(以下步骤将对其进行大量修改,创建副本的目的是为了保留原版)
第二步
2.1.进入KingdomWorld\Development\Src目录,找到UTGameContent文件夹将其全部删除。
2.2.进入KingdomWorld\Development\Src\UTGame目录,删除UTStats.uci以及Classes文件夹下面的所有文件,但是保留Classes文件夹。
2.3.进入KingdomWorld\Development\Src\UTGame\Classes目录,创建一个do_not_delete.uc,键入以下内容
1. class do_not_delete extends object;
2. defaultproperties
3. {
4. }
复制代码
创建此文件的目的是因为让UTGame目录顺利编译成UTGame.u文件,因为UDK免费版的原因,启动编辑器和游戏他会自动寻找UTGame.u文件,所以此包无法全部删除(除非你有源代码级授权,就可以修改UTGame目录指向)
第三步
进入KingdomWorld\UTGame\Content目录,删除所有文件
KingdomWorld\UTGame\Content\Maps\EnvyEntry.udk 文件和KingdomWorld\UTGame\Content\UI\UI_Fonts_Final.upk文件除外,这两个是系统需要的底层pak 包,字体和空场景,最好别删。
第四步
由于我们已经删除了所有关于原始的UTGame的资源和代码文件,现在的文件夹已经相对于来说是非常干净的了,那么,我们需要重新制作一个类似于c++里面的main函数,因为UTGame目录已经被我们咔嚓掉了。他的引用不到。
4.1.来到KingdomWorld\Development\Src目录,创建文件夹KWGame,在其创建Classes文件夹
4.2.进入KingdomWorld\Development\Src\KWGame\Classes目录
4.3.创建一个KWInfo.uc,键入以下内容
1. class KWInfo extends GameInfo;
2. DefaultProperties
3. {
4. //设置角色控制类
5. PlayerControllerClass=class'KWGame.KWPlayerController'
6. }
复制代码
4.创建一个KWPlayerController.uc,键入以下内容
1. class KWPlayerController extends GamePlayerController;
2. DefaultProperties
3. {
4. }
复制代码
第五步
我们已完成了创建了我们自己的初始化函数KWInfo和控制类函数KWPlayerController,那么我们需要吧编辑器的引用指向他们。
5.1.进入KingdomWorld\UTGame\Config目录。
5.2.打开DefaultGame.ini文件。找到[Engine.GameInfo]中的
5.2.1.DefaultGame并修改成DefaultGame=KWGame.KWInfo
5.2.2.DefaultServerGame并修改成DefaultServerGame=KWGame.KWInfo
5.2.3.PlayerControllerClassName并修改成PlayerControllerClassName=KWGame.KWPlayerController
第六步
在这里,我们基本完成了整个目录的精简,只留下我们需要的部分了,最后,我们需要对整个工程进行优化,去掉不存在和不需要的包的引用。加入我们的引用目录。
6.1.进入KingdomWorld\UTGame\Config目录。
6.2.打开DefaultEngine.ini文件。找到[UnrealEd.EditorEngine]中的
6.2.1.ModEditPackages并修改成ModEditPackages=KWGame(吧ModEditPackages最前面的;去掉)
6.2.2.删除+EditPackages=UTGameContent这句
6.2.3.找到[Windows.StandardUser]中的MyDocumentsSubDirName并修改成MyDocumentsSubDirName=KWGame
========2010-01-29修改新增==============
6.3.打开DefaultUI.ini文件。找到[Engine.UIInteraction]中的
6.3.1.UISkinName并修改为UISkinName=DefaultUISkin.DefaultSkin
6.4.打开DefaultEngine.ini文件。找到[Engine.Engine]部分。
6.4.1.将[Engine.Engine]部分改为如下(其实就是吧UTGame改成Engine,并且去掉前缀UT)
1. [Engine.Engine]
2. ConsoleClassName=Engine.Console
3. EditorEngine=UTEditor.UTEditorEngine
4. UnrealEdEngine=UTEditor.UTUnrealEdEngine
5. DefaultOnlineSubsystemName=OnlineSubsystemPC.OnlineSubsystemPC
6. UseStreaming=True
7. ScoutClassName=Engine.Scout
8. GameViewportClientClassName=Engine.GameViewportClient
9. ;DefaultPostProcessName=FX_HitEffects.UTPostProcess
10. bOnScreenKismetWarnings=true
11. TimeBetweenPurgingPendingKillObjects=30
12. TinyFontName=EngineFonts.TinyFont
13. MediumFontName=MultiFont'UI_Fonts_Final.HUD.MF_Medium'
14. LargeFontName=MultiFont'UI_Fonts_Final.HUD..MF_Large'
15. SubtitleFontName=MultiFont'UI_Fonts_Final.HUD.MF_Medium'
16. AllowShadowVolumes=False
17. LocalPlayerClassName=Engine.LocalPlayer
18. MaxParticleResize=1024
19. MaxParticleResizeWarn=10240
20. ;DemoRecordingDevice=Engine.DemoRecDriver
21. bEnableColorClear=TRUE
复制代码
(例如ConsoleClassName=UTGame.UTConsole改为ConsoleClassName=Engine.UTConsole)
6.4.2.找到[Engine.DataStoreClient]部分删除节点所有文件,新增一行 +PlayerDataStoreClassNames=Engine.UIDataStore_OnlinePlayerData
如下:
1. [Engine.DataStoreClient]
2. +PlayerDataStoreClassNames=Engine.UIDataStore_OnlinePlayerData
复制代码
6.4.3.找到[Engine.UIDataStore_OnlinePlayerData]改为如下(其实就是吧UTGame改成Engine,并且去掉前缀UT)
1. [Engine.UIDataStore_OnlinePlayerData]
2. ProfileSettingsClassName=Engine.OnlineProfileSettings
3. FriendMessagesProviderClassName=Engine.UIDataProvider_OnlineFriendMessages
4. FriendsProviderClassName=Engine.UIDataProvider_OnlineFriends
复制代码
6.4.4.找到[Engine.StartupPackages]改为如下
1. [Engine.StartupPackages]
2. bSerializeStartupPackagesFromMemory=TRUE
3. bFullyCompressStartupPackages=FALSE
4. Package=DefaultUISkin
5. Package=EngineMaterials
6. Package=EngineSounds
7. Package=EngineFonts
8. Package=EngineBuildings
9. -Package=SoundClassesAndModes
复制代码
6.4.5.找到[Engine.PackagesToForceCookPerMap]去除所有节点。
6.5.打开DefaultGame.ini文件。找到[Engine.WorldInfo]部分。
6.5.1.找到EmitterPoolClassPath并修改为EmitterPoolClassPath="Engine.EmitterPool"
6.5.2.找到DecalManagerClassPath并修改为DecalManagerClassPath="Engine.DecalManager"
7.删除KingdomWorld\UTGame\Config下所有UT开头的ini文件,并且重新进入编辑器,就会自动生成UT开头的ini了
========2010-01-29修改新增==============
总结:
至此,你已经完成UDK目录的精简,并且删除了UTGame的全部内容,在接下来的章节,我会一步步介绍如何在这个精简工程中,全部制作属于自己的东西
这时候你打开UDK编辑器,可能需要等待一会的时间,因为他在重新编译一些东西,耐心等待一下就可以了。
下一章节预告【跟着楼主做游戏之】《建立一个空工程-下》建立一个空的VS工程,并且调试KWGame项目。
(请大家提前安装vs2008或者vs2005,最好使用vs2008,vs2003是不可以的,因为有个脚本调试插件,他只能在vs2008或者vs2005中运行)
另外本文的大部分内容,阅读者最好有一定的编程基础,多以代码为例讲解。
UDK入门教程--第一章:第二节 建立一个空工程-下
如果你确定看完了《建立一个空工程-上》这篇,并且没有问题,那么接着和我学习把。
第一步:
首先确保机器已经安装vs2008(或者vs2005,以后文章都以vs2008为例),然后安装nFringe
(nFringe的最新版
第二步:
2.1.打开VS2008,选择左上角菜单中的【文件】--【新建】--【项目】
2.2.选择UnrealEngine 3 Licensees Project
2.3.检查【创建解决方案的目录】的勾是否已被去掉。
2.4.位置填写为 安装目录:\KingdomWorld\Development\Src\KWGame
2.5.名称为KWGame(注意大小写),点击确定.
2.6.打开目录KingdomWorld\Development\Src\KWGame\KWGame将其所有文件剪切至KingdomWorld\Development\Src\KWGame
2.7.打开目录KingdomWorld\Development\Src\KWGame删除KWGame文件夹(此时里面那个文件夹应该没有文件,都被你剪切到上面了)
2.8.打开目录KingdomWorld\Development\Src\KWGame使用vs2008打开KWGame.sln工程
第三步:
3.1.选择左上角菜单中的【项目】--【KWGame 属性】
3.2.设置如下参数。
General中
Game中的Target Game为UnrealEngine 3 Mod
UCC Path为 安装目录:\KingdomWorld\Binaries\UDK.exe
Reference Source Path为 安装目录:\KingdomWorld\Development\Src
Build中
Script Outputs中的Manually set UCC output directory为 安装目录:\KingdomWorld\UTGame\Script
Debug中
Start Action中的Start Game Executable为 安装目录:\KingdomWorld\Binaries\UDK.exe
Load map at startup为你的地图文件名,如我们为默认上次没删的EnvyEntry.udk则填写为EnvyEntry
Start with speacified game为KWGame.KWInfo
勾上Enable unpublished mods
勾上Open log window at postions并且设置为0 Left,0 Top
第四步:
4.1.进入目录KingdomWorld\Development\Src\KWGame,将Classes文件夹改名为Classes1
4.2.在vs2008里选中KWGame工程点击右键,选择【添加】--【新建文件夹】
4.3.讲其文件夹名命名为Classes
4.4.关闭vs2008,进入目录KingdomWorld\Development\Src\KWGame,删除Classes文件夹,将Classes1改名回Classes
(因为在上篇文章里这个文件夹下有2个文件,先改名是为了防止vs2008里创建同名文件夹失败)
4.5.打开目录KingdomWorld\Development\Src\KWGame使用vs2008打开KWGame.sln工程
4.6.在vs2008里选中KWGame工程中,选中Classes目录,点击右键,选择【添加】--【添加现有项】
选择KingdomWorld\Development\Src\KWGame\Classes目录下的KWInfo.uc和KWPlayerController.uc(上篇教程中创建)
4.7.在vs2008里选中KWGame工程(选择工程路径不是Classes文件夹)点击右键,选择【添加】--【添加现有项】
选择KingdomWorld\UTGame\Config目录下的DefaultEngine.ini和DefaultGame.ini(特别注意添加文件的时候,在窗体那里添加按钮旁边有个小三角,选择添加为链接)
总结:
至此,你可以在VS2008中调试你的UDK项目了,在下面章节中,我们将会对这个工程继续讲解。来做一个类似大菠萝的视角的游戏。
UDK入门教程--第二章:第一节 创建一个自定义视角的游戏-上
在以上的章节中,我们已经创建了一个可以调试的UDK空环境,并且保证除了底层Engine部分,其他的资源都已经剔除掉了,在这里,我们接着开发属于自己的游戏。
我们先吧制作好的场景(可以参考其他教程或者等待其他人更新场景制作教程,在此系列就不涉及大部分UDK编辑器部分的操作,本系列留给程序员)放入KingdomWorld\UTGame\Content\Maps中。
附带一个我随便制作的场景:
进入KingdomWorld\Development\Src\KWGame目录,打开KWGame.sln工程。
修改工程属性的Debug中Start Action中的Load map at startup为1001(地图名)
保存(ctrl+s)好后,我们可以在工程里按下菜单里的【调试】--【启动调试】(F5)来看效果。
如果能正确显示如上画面后,代表你的vs工程配置没有问题了。
接下来我们需要按下键盘的"~"键,呼出控制台,输入exit并按下回车退出游戏界面
要注意的是,这时候虽然游戏关闭了,但是你的VS工程并没有关闭,
我们需要点击菜单里的【调试】--【停止调试】(Shift+F5)来停止工程。
现在我们在vs工程里双击打开Classes里的KWPlayerController.uc进行编辑。
可以发现,我们编写的KWPlayerController类实际上继承了GamePlayerController类。
而GamePlayerController类是做什么的呢?(具体我们可以参考API手册,文章末尾的附件)
其实是一个角色控制类。这么说吧,比如像在控制台里面的命令,鼠标,键盘的操作,全部都在这个控制类。
你可以吧他看成一个Input控制类。
所以,当你的鼠标点击的时候,我们可以在这个类里编写代码来实现你需要的功能。
在学习写第一个类的时候,我们可以加一小段调试代码,从而观察环境里的这个类是否被运行。
3.1.新增一个PostBeginPlay方法
1. simulated event PostBeginPlay()
2. {
3. super.PostBeginPlay();
4. `Log("角色控制类运行");
5. }
复制代码
新增代码后的效果:
我们通过手册可以看到GameFramework.GamePlayerController的父类是Engine.PlayerController
而Engine.PlayerController中,则有一个simulated event PostBeginPlay,所以我们可以重写,他也会被自动调用(这是UDK的uc脚本机制)
其实追溯源头应该是Engine.Actor,而在此类有一个event PostBeginPlay();在他继承的类中重写,则会被自动调用。
而大部分类的主父类都集成了它,基本上类在运行后,都会首次寻找是否有PostBeginPlay方法来执行。你可以吧他看做这个类的构造函数吧。
因为重写了他,因为我们并不知道继承的这个类的上面那些乱七八糟类里同样方法里做了一些什么事情,所以我们试用super来调用父类的这个函数。在后面再插入我们自己需要编写的代码。
由于我们之前已经在KWInfo.uc里的DefaultProperties方法里,对PlayerControllerClass的指针已经赋值到了我们新做的KWGame.KWPlayerController里。所以这里我们新做的控制类则会被调用。
在这里说一下,由于我们在Default.ini里修改的[Engine.GameInfo]中的DefaultGame指向到KWGame.KWInfo类,那么KWInfo你可以看做整个游戏的main函数。
而PlayerControllerClass是默认的用户控制类的指针(其他指针可以参考API,后面也会对一个个指针进行讲解)
而我们需要做的就是新建一个类继承他,然后在main里绑定他。
现在,我们可以按下F5,看一下左边日志窗口的提示信息。
如果你的界面如上图所示,那么你的游戏已经成功调用了KWGame.KWPlayerController类。
很激动吧。你已经完成了你的第一个类的编写,并且通过VS已经调试出结果了。
还记得我们之前的步骤吗?按下键盘上的"~"键呼出控制台,输入exit,并且在vs里点击停止调试就可以回到我们的界面来继续编码。
现在你已经基本搭建好一个良好的UDK编写代码环境了,在下一章节,我们将会继承一个新的Camera类,通过KWInfo来绑定,来实现我们自己的游戏界面的视角。
本文附带源码:
文章中所说的API手册:http://www.zY
UDK入门教程--第二章:第二节 创建一个自定义视角的游戏-下
在上一章节中,我们对自定义的GamePlayerController类进行了调用,那么接着遨游我们的虚幻之旅吧。
第一步:
我们先把制作好的角色模型(可以参考其他教程或者等待其他人更新模型制作教程,在此系列就不涉及大部分UDK编辑器部分 的操作,本系列留给程序员)放入KingdomWorld\UTGame\Content\Characters\Heroes\Achilles 中。(KingdomWorld\UTGame\Content后的路径随便你定义,你直接放在Content里也行,这样做的目的仅仅是便于管理而已)
附带一个我随便制作的模型:
第二步:
打开工程。在Classes文件夹里添加一个KWCamera类。并编写如下代码
1. class KWCamera extends Camera;
2. simulated event PostBeginPlay()
3. {
4. super.PostBeginPlay();
5. `Log("摄像机类运行");
6. }
复制代码
我们编写了一个继承了摄像机类的的类,从而完成我们自己的摄像机视角。
第三步:
找到我们之前编写的KWPlayerController.uc文件,在DefaultProperties内添加一行
1. CameraClass=class'KWCamera'
复制代码
这里要特别说一下,DefaultProperties可以当做是每个类的函数初始化的地方,这里是不需要分号来换行的
通过CameraClass=来赋值指针为我们编写的类从而重载。
这时候可以通过F5来调试一下,看看日志窗口`Log("摄像机类运行");这句话是否正确执行。
在控制台输入exit退出游戏界面,记得在vs里停止工程,我们来做一个出生类。
第四步:
打开工程。在Classes文件夹里添加一个KWPawn类。并编写如下代码
1. class KWPawn extends GamePawn;
2. simulated event PostBeginPlay()
3. {
4. super.PostBeginPlay();
5. `Log("出生类运行");
6. }
7.
8. simulated function name GetDefaultCameraMode( PlayerController RequestedBy )
9. {
10. `Log("开始获取默认摄像机模式");
11. `Log("设置为Isometric模式");
12. return 'Isometric';
13. }
14.
15. defaultproperties
16. {
17. //删除场景内原有的元素
18. Components.Remove(Sprite)
19. //创建动态环境光照对象--用于InitialSkeletalMesh对象(使用LightEnvironment成员赋值)
20. Begin Object Class=DynamicLightEnvironmentComponent Name=InitLightEnvironment
21. ModShadowFadeoutTime=0.25
22. MinTimeBetweenFullUpdates=0.2
23. AmbientGlow=(R=.01,G=.01,B=.01,A=1)
24. AmbientShadowColor=(R=0.15,G=0.15,B=0.15)
25. LightShadowMode=LightShadow_ModulateBetter
26. ShadowFilterQuality=SFQ_High
27. bSynthesizeSHLight=TRUE
28. End Object
29.
30. //添加进组件库
31. Components.Add(InitLightEnvironment)
32.
33. //创建骨骼模型
34. Begin Object Class=SkeletalMeshComponent Name=InitialSkeletalMesh
35. CastShadow=true
36. bCastDynamicShadow=true
37. bOwnerNoSee=false
38. //使用组件库里动态创建的环境光照对象InitLightEnvironment
39. LightEnvironment=InitLightEnvironment;
40. BlockRigidBody=true;
41. CollideActors=true;
42. BlockZeroExtent=true;
43. //物理引擎包
44. //PhysicsAsset=PhysicsAsset'Achilles_Art.Achilles.Achilles_Full_Apa'
45. //动画包--序号0
46. //AnimSets(0)=AnimSet'Achilles_Art.Achilles.Achilles_Full_Aas'
47. //动画模板
48. //AnimTreeTemplate=AnimTree'Achilles_Art.Achilles.Achilles_Full_Aat'
49. //模型文件
50. SkeletalMesh=SkeletalMesh'Achilles_Art.Achilles.Achilles_Full_Amesh'
51. End Object
52.
53. //Mesh来自GamePawn的基类成员(貌似是设置出生角色)
54. Mesh=InitialSkeletalMesh;
55. //添加进组件库
56. Components.Add(InitialSkeletalMesh);
57. }
复制代码
这段代码我说明两个地方。
一个是defaultproperties里面的成员,这个我是参考原本的UDK- 2010-01\Development\Src\UTGame\Classes\UTPawn.uc文件复制过来。并且我对如上代码做了相应的注释。由 于我提供的资源包里只有模型文件。所以其他资源的属性我都注释掉了。
另外一个是simulated function name GetDefaultCameraMode( PlayerController RequestedBy )
这个方法会在Camera启动后调用得到。
之所以我传入return 'Isometric';是因为通过观察KingdomWorld\Development\Src\Engine\Classes\Camera.uc 里面的UpdateViewTarget方法,并没有这么一个字符串,所以我是随便写的,你也可以随便写一个,在后面我们继承的Camera类中,重写 UpdateViewTarget方法取得值来进行处理。所以这里的'Isometric'你改成'xx','yy','bb'都可以
第五步:
找到我们之前编写的KWInfo.uc文件,在DefaultProperties内添加两行
1. bDelayedStart=false
2. //设置出生类
3. DefaultPawnClass=class'KWGame.KWPawn'
复制代码
DefaultPawnClass绑定到我们修改的Pawn里,这里不做多说明。
特别说明下bDelayedStart成员变量,bDelayedStart来自继承的 GameInfo类(有兴趣的可以去KingdomWorld\Development\Src\Engine\Classes\GameInfo.uc 里看这个变量调用的一些地方做了什么)bDelayedStart 在此刻是非常重要的,因为我们重写了游戏,而不是使用游戏内的Kismet来进行绑定,那么此时游戏内是没有Pawn的,我们需要告诉引擎来调用我们的出 生类,而不是等待,那么,把他设置成False,游戏引擎将不再等待角色的产生,不再延迟而立即产生了我们的Pawn(当然,如果你需要游戏做过场动画或 者摄像机漫游的时候,以及在登陆界面的时候-后面说,可以做一个方法来设置他的值将他设置为True)
这时候,我们进行调试,可以发现我们编写的类已经全部正确调用,并且通过键盘的WSAD键进行移动后,发现我们设置的角色已经绑定我们的摄像机一起移动了。
第六步:
现在我们已经成功了部署整体架构,还记得我们之前的那个'Isometric'吗?我们现在就得来处理它,完成最后一步,实现自己的摄像机模式。
找到我们之前编写的KWCamera.uc文件,对继承的Camera类点右键,选择转到定义。
(或者打开KingdomWorld\Development\Src\Engine\Classes\Camera.uc)
按下键盘的Ctrl+F找到UpdateViewTarget方法,复制进我们的KWCamera.uc
因为我们要在中间部分修改,所以不好直接调用super.UpdateViewTarget()了。
找到switch( CameraStyle )部分,添加我们前面定义的那个'Isometric'的case
1. /*****************************************************************
2. *自定义摄像机模式开始
3. *****************************************************************/
4. //从自定义的Pawn类(KWPawn)的GetDefaultCameraMode传来
5. case 'Isometric':
6. //修改摄像机位置
7. Rot.Pitch = (-55.0f *DegToRad) * RadToUnrRot;
8. Rot.Roll = (0 *DegToRad) * RadToUnrRot;
9. Rot.Yaw = (30.0f *DegToRad) * RadToUnrRot;
10.
11. //修改摄像机的位置和角色的偏移
12. Loc.X = PCOwner.Pawn.Location.X - 64;
13. Loc.Y = PCOwner.Pawn.Location.Y - 64;
14. Loc.Z = PCOwner.Pawn.Location.Z + 156; //距离位置
15.
16. //设置缩放
17. Pos = Loc - Vector(Rot) * FreeCamDistance;
18. OutVT.POV.Location = Pos;
19. OutVT.POV.Rotation = Rot;
20. break;
21. /*****************************************************************
22. *自定义摄像机模式结束
23. *****************************************************************/
复制代码
由于复制过来的代码使用了一个成员变量OutVT.POV.FOV = DefaultFOV;
所以,在Camera类里,找到赋值他的地方添加进我们重写的KWCamera类里。添加DefaultProperties方法。这样方便我们以后如果对这个值进行修改而不动底层的东西。
1. DefaultProperties
2. {
3. DefaultFOV=90.f
4. }
复制代码
/*****************************************************************
*
* UpdateViewTarget()方法介绍
*
* 这个类继承了基类的Camera摄像机类.
* 当这个类创建的时候,则会自动调用基类GamePawn的虚方法GetDefaultCameraMode(需要重载)(ps.其实UE3里,没有虚函数,他们extends后,都属于重写,本身他就有这方法,可以进基类的uc文件看他怎么写的).
* 如果想自己创建新的摄像机模式,则需要重载GamePawn的GetDefaultCameraMode的方法.
* /** Camera Mode */var Name CameraStyle;
* Camera类里的CameraStyle成员变量,就是通过GamePawn的GetDefaultCameraMode实现的。(ps.我觉得这个方法名用Set更合适,不过他不是方法,是需要继承的,所以Get也没错)
* 我在继承的GamePawn类(KWPawn)里返回了Isometric,那么,我们在Camera.uc里,找到U
展开阅读全文