智慧 + 毅力 = 无所不能

正确性、健壮性、可靠性、效率、易用性、可读性、可复用性、兼容性、可移植性...

导航

UDK游戏打包详解

Posted on 2015-04-24 17:22  Bill Yuan  阅读(2024)  评论(0编辑  收藏  举报

转自:http://blog.sina.com.cn/s/blog_944177030100ycki.html

安装完的udk目录下有4个主要的文件夹

  • Binaries -这个文件夹包含游戏的exe程序、UnrealFrontEnd(编译器)和其他程序。尽量不要动这个文件夹。
  • Development -包含了Unrealscript文件的源代码。非常重要的目录。游戏将使用这个目录的源代码(.uc文件),并从这里编译.u文件。
  • Engine - 引擎所需文件,不要动这些文件。
  • UTGame -你的游戏所有的文件。你将经常只用这个目录。

在UTGame文件夹中包含了下面这几个重要的文件夹

  • Config - 放置Ini配置文件。
  • Content – 包含实际的关卡、模型、声音等游戏所需资源,同样非常重要。
  • Localization – 放置所有的对话文本、菜单文本等等所有跟文字有关的文本。
  • Movies – 放置介绍视频、过场动画。为Bink格式。
  • Script – 用来放编译后的Unrealscript 代码。
  • Splash – 本地splash图片,即加载游戏时所用到的图片。

除了以上文件夹,UTGame文件中其他文件夹都不是很重要。

 

    在UTGame\Content文件夹中放有大量的UT3内容(在u3中美术等资源称为内容。UT即虚幻竞技场,为Epic出的一款游戏)。最好把所有的内容都放在这个文件夹下。当你将游戏进行打包,它将自动脱去UT3的内容而不需要手动去删除多余的文件。我通常在Content 文件下创建一个文件来放置我的游戏内容。 如:

  • UTGame\Content\ExampleGame\Levels
  • UTGame\Content\ExampleGame\UPK

    只要两个目录:一个存放关卡,一个存放upk文件。你不必像UT3那样需要设置成千上万的内容文件。大部分的游戏不需要众多的文件夹。举个例子,我们的游戏The Ball ,有1.5 GB 的数据容量,却只有20个upk文件。

 

· UnrealScriptunreal脚本)


 

    进入Development\Src\目录,创建一新文件夹。如"MyGame"。这个文件夹的名字将作为编译后的.u文件的名称。假如你的游戏叫"Bobby",你最好把这个文件夹也改成"Bobby"。所有在这个文件夹里头的unrealscript 文件将编译成游戏使用的单个.u文件。

    在"MyGame" 文件夹下创建"Classes"文件夹。在这个文件夹中添加从这个zip中解压出来的3个文件,MyGameInfo.uc, MyPawn.uc, MyPlayerController.uc。

 


    下一步,编译。我们首先要确定游戏读取我们编译后的.u文件代码。进入 UTGame\Config\ 目录并打开DefaultEngine.ini。 找到 "[UnrealEd.EditorEngine]"部分,在这一部分的最后一行添加 "+EditPackages=MyGame" 。如下面:

        +EditPackages=UTGame
       +EditPackages=UTEditor
       +EditPackages=UTGameContent
       +EditPackages=MyGame

顺序很重要。因为这个顺序决定了导入和编译的顺序。
   这一行代码可以使编辑器时启动总是导入MyGame.u文件。关闭文件的只读属性(否则不能保存),保存并关闭。当然删除 UTEngine.ini也行。这么做会强制引擎基于DefaultEngine.ini创建新的UTEngine.ini ,省得你去修改UTEngine.ini中对应的信息。


   下一步, 进入Binaries目录,运行UnrealFrontEnd.exe.  Frontend 是可以允许你处理大量事情(代码?)的重要工具。当前情况下我们将使用它来编译我们的代码。在工具栏顶部,点击"Make"标签右边的下三角键号,然后点击"Full Recompile"(全部编译)。

 

假如所有操作都是正确的,控制台中将会出现提示信息。当编译结束后在 UTGame\Script\ 中将生成"MyGame.u"文件。

· Ini filesini文件)

 


 

    下一步,我们让游戏使用我们自己定义的gametype (游戏类型)和pawn (出生)作为游戏开始的默认值。

 

打开 UTGame\Config\DefaultGame.ini。去掉文件的只读属性。 找到 "[Engine.GameInfo]"部分。

  • "DefaultGame=UTGame.UTDeathmatch"替换成 "DefaultGame=MyGame.MyGameInfo".
  • "PlayerControllerClassName=UTGame.UTPlayerController"替换成"PlayerControllerClassName=MyGame.MyPlayerController"

保存。 删除UTGame.ini ,它将以你修改过的DefaultGame.ini 创建一新的ini。

 

· Level(关卡)


 

    进入Binaries\Win32 创建UDK.exe的快捷方式. 这末尾添加 "Editor -log"。 举例 - "G:\UDK\UDKExampleGame\Binaries\Win32\UDK.exe editor -log"。运行。

    创建一极简单的关卡。 右键点击 BSP Cube 按钮 ,在弹出的对话框中输入尺寸。X, Y, Z输入1024, 勾选 "Hollow?"。点击“Build”。

    下一步,在左边工具栏中点击 "CSG Add"按钮。

推进到立方体里面,右键点击地面(立方体内部底面),在弹出的菜单中选择 - Add Actor - Add Playerstart,添加玩家出生地点

重复上一步操作,不同的是这次我们增加一盏灯(add a Light)。然后将创建出来的灯移到房间中间。

保存关卡。我将这个关卡命名为 "MG-ExampleGameLevel",注意,前缀很重要。在MyGameInfo.UC中, "MG" 是被指定的前缀。假如没有这个前缀,游戏将不知道为它使用哪种gametype(游戏类型)。

    然后, rebuild the level(重构关卡)。 在顶部菜单选择 - Build - Build All

再次到顶部菜单。选择View - World Properties. 在弹出的WorldInfo 窗口中找到Game Type For PIE,改成 MyGameInfo。PIE 就替代了 Play-In-Editor,这就决定了在编辑器中播放游戏是使用哪种gametype(游戏类型)。

现在 右键点击地板  选择Play From Here 。注意你的关卡和游戏,变成第3人称的游戏啦!

 

Menu(菜单)


 

    至于菜单,实际上也是个关卡。是在启动游戏时加载的关卡。这种关卡是包含了Kismet(unreal引擎的简单脚本编辑器)。
   将你已有的关卡另保存为 "ExampleGameFrontEnd".
   下一步,创建UI Scene(UI场景)。我们同样也要创建我们的首个UI package (包)。进入content browser (内容浏览器),在左下角点击“New”。填入package和UI Scene的名称。确定在Factory (类型)标签中选择UI Scene。

 

在窗口的任意地方右击选择- Place Widget(放置控件) - Button [Standard](标准按钮),创建按钮。重新缩放按钮直到覆盖整个屏幕(绿色边就是屏幕边缘,注意,默认就是覆盖整个屏幕的)。

    为了让按钮能实现某些功能我们准备使用UI Kismet。但这样做实际上不是最恰当的方式。最恰当的方式是为按钮使用UnrealScript,因为UnrealScript更简洁一些,不会像 ui kismet那样有多余的信息。但是Kismet对于美工而言却是简单易懂更容易实现功能的。

    在按钮上右键选择 - Unreal Kismet Editor.

 

 

在全局Sequence(序列)中,添加 New Event(新的事件) - UI - On Click,  New Action(新的行为) - Level(关卡) - Activate Level Event(激活关卡事件)。

并把它们连接起来,如图所示。

选择Activate Level Event,在其属性栏中找到EventName,输入名称(名称不能有重名),我命名为"OpenYourLevel",如上图。当有人点击按钮时,它将使关卡触发一个event(事件)。然后关卡会使用这个事件,并访问它的Kismet。目前我们要做的是使用控制台命令来加载下个关卡。

   在我们完成这个UIScene前还要做最后一件事。在ui编辑器的空白处随便点击一下,在右上角的属性栏中找到Flags(标签) - Pause Game While Active(激活的时候暂停游戏),去掉勾选。

 

保存你的package(包). Packages 必须手动保存!将它保存在你所创建的目录里头,在这个例子中将它保存在UTGame\Content\ExampleGameContent\UPK.

   现在将这个event(事件)连接到你的关卡。打开关卡的Kismet (顶部工具栏的绿色K图标), 在空白出添加新的Action(行为) - UI SceneSUI场景) - Open Scene(打开场景). 将它连接到Level Startup (新建新的 Event - Level Startup(关卡开始))。在内容浏览器中选择刚才创建的UI,然后在kismet中选择OpenScene节点,在其属性栏中找到Scene,添加刚才创建的UI ,如下图所示。

添加新的Event - Remote Event(远程调用事件)和新的Action - Misc - Console Command(控制台命令). 在 Remote Event(远程事件)属性栏中, EventName指定为和你要调用的按钮相同的Event(事件)名称 ,在我的例子中叫"OpenYourLevel"。 在Console Command(控制台命令) 添加新的信息"open MG-examplegamelevel" – 或者调用你可以游戏的关卡。这个事件中按钮按下的时候将会被执行,通过控制台命令他将加载到你的关卡中。
现在 添加Action(行为) - Toggle(开关) - Toggle Cinematic ModeCinematic模式开关)和Variable (变量)- Player (玩家),并将它们连接起来。这么做在关卡启动的时候会对进行玩家冻结。连接图如上图所示:

   在关卡开始的时候可以使用matinee 来播放剧情动画。可以在Hourences.com找到关于的编辑剧情的教程。你可以在这个关卡中创建任何类型的3D背景环境,也可以使用2D图片来简单的覆盖整个屏幕。

 

    完成!注意在编辑器中这个是没有功能的。编辑器是不允许你使用一个"Open"控制台命令的。

 

 

 

· Localization(本地化)


 

    本地文件包含游戏所需所有文本。想要改变游戏的语言版本,你只需指定指定另一语言文件即可。

 

我通常删除Localization 文件夹里头所有的ini文件,然后从头开始。但是这样做将中止UT3 demo (udk自带的游戏),所以假如你仍想用原来的demo就不要删除。

 

    首先, 关闭编辑器。编辑器只在启动的时候检测ini文件。除非你重启它,否则它是不会检测其他你自己创建的ini文件的。确定保存关卡和package 。

 

    创建一TXT文件, 重命名为 "MyGame.int"。然后添加

 

    [ExampleOfASection]    01=Most Awesome Title Ever    02=To play click the button

 

中括号里头的文字为一section(部分),用来标记内容。 01和02只是指定了在section所处的行数而已。当然你不一定都使用数字。
   再次打开编辑器,然后打开你的关卡和界面package 。打开你制作的UI Scene (界面场景)。右键- 选择Place Widget (放置控件)- Label [Standard](标准标签), 创建一label(标签)。然后使用相同的操作再创建一个。选择其中一个,在右上角的属性栏中找到Data(数据) - Data Source(数据源) - Mark Up String

添加 "<strings:mygame.ExampleOfASection.01>"  Mark Up String

    格式为NameOfIntFile.NameOfSection.NameOfLine.(ini文件名.Section部分名.行名)

   你可以使用相同的方法为另外一个label进行设置。

 

    假如你在ini文件中改变这一行,它将跟着游戏或者编辑器进行加载。

 

· Ini Files - More Funini文件,更多乐趣)


 

    让我们回到ini文件来修改更多的配置。关闭编辑器。编辑器运行的时候你是不能修改ini文件的。

 

    打开DefaultEngine.ini - section [URL]

 

  • MapExt=udk – 你不必修改这个地方,除非你想要改变你的关卡范围。
  • Map=UTFrontEnd.udk – 改成ExampleGameFrontEnd 。这将改变加载默认菜单关卡。
  • LocalMap=UTFrontEnd.udk – 同上

    在[Engine.PackagesToAlwaysCook] 部分, 添加"+Package=ExampleGameFrontEnd"。这将使UnrealFrontEnd cook这个文件。

   在 [Engine.StartupPackages]部分, 添加"+Package=MyGameInterface"。这将使游戏总是加载这个package。你就不必为每个package执行同样的操作。 特别的界面元素包基本都符合这个条件,所以剩下的不必进行重复的操作。

 

    在 [Engine.PackagesToForceCookPerMap] 部分, 添加".Map=ExampleGameFrontend",immediatelyfollowed by ".Package=MyGameInterface." 这会强制package在进入关卡时强制使用上面的信息,并且只能作用于那个关卡。界面元素的packages 也会强制加载进去。有时候关卡会在加载某一资源时发生意外,可以强制cooking他们来解决这个问题。

   在 [FullScreenMovie]部分,可以用来指定哪个地方要播放所指定的视频的。

   OK,完成了!再次删除 UTEngine.ini ,然后它会使用DefaultEngine.ini所设置的配置进行代替。
启动游戏,检测下你的关卡。

 

 

· Cooking


 

    然后, cooking。Cooking基本上就是最终的编译了。 它会将你制作的内容都准备好。
   Cooking是将你的所有内容包打包成少量的受保护文件的一个过程。你的内容包是不可能至少是很难再被提取出来的。

   要完成这个环节,请再次打开UnrealFrontEnd.exe (在Binaries文件夹中), 注意在左上角的"Cooking"标签(不是按钮),点击它,找到"Maps to cook"(cook地图),输入你的单个关卡名称。你不需要在这里输入"ExampleGameFrontEnd"关卡。记住,你已经将它在ini文件中设置成"AlwaysCook"(总是执行Cook)。

 

  下一步,在顶部工具栏点击 Cook

 

    完成后,它将创建UTGame\CookedPC 文件夹。文件夹中的内容是将要发布给玩家使用的游戏内容。

 

 

 

· Packaging(打包)


 

    运行UnrealFrontEnd.exe, 点击 "Package Game" ,这弹出的对话框中输入你的游戏的名称。 打包完后在主目录下你将找到打包完后的游戏安装包。这样就完成游戏的打包啦!

 

 

· Troubleshooting(故障检修)


 

    • 检查你是否有打字排版的错误。
    • 你不能在进行游戏或者编辑器运行时修改ini文件。假如你这么做,它将很可能忽略你所修改的。
    • 检查下你在UTGame\Script\中是否编译了.u文件。
    • 你要明白Unreal 使用的是不重名并且简单的文件名。在文件名中使用空格、不标准的字母、重名文件是不允许的。Unreal分不清关卡"Doghouse.udk"和内容package "Doghouse.upk"之间的区别,因为它认不到文件扩展名。所有的文件不允许重名!
    • 使用"-log"运行游戏或者检查UTGame\Logs\Launch.log。假如游戏在loading的时候卡住,尝试一下寻找开始 loading(加载)部分的线索。
    • 你的关卡必须命名为"MG-NameOfYourLevel"(格式为:脚本规定的前缀-你的关卡名称)。前文已经提到前缀很重要。
    • 假如你在编译.uc文件时弹出"Superclass errors"(超级类错误。超级类也就是父类的父类),是因为你将"+EditPackages=MyGame"放在错误的位置了。这一行语句的顺序很重要。它必须是在ini的Section的底部。可以查看下相关的教程