使用 nFringe 和 UnrealScript 语言创建简单的 UDK 游戏






4.40/5 (7投票s)
本教程将介绍如何设置 nFringe,创建项目,以及编写和编译一些简单的 UnrealScript 代码。
引言
UDK 是 Unreal Engine 3 的免费版本,仅用于非商业开发。Unreal Engine 3 是当今最流行的专业游戏引擎之一,曾用于《战争机器》、《虚幻竞技场 3》和《质量效应》等游戏。然而,UDK 不包含 Unreal Engine 3 的 C++ 源代码。
可以从下面的链接下载 UDK:
用于编程 Unreal Engine 3 的语言是 UnrealScript。UDK 配备了 UnrealScript 的编译器,但缺少一个合适的 IDE。我偏爱的 IDE 是 nFringe。nFringe 是 Visual Studio 2008 的一个语言模块(也可与 Visual Studio 2005 一起使用)。如果您没有 Visual Studio,可以使用 Visual Studio 2008 shell。
虽然理论上您可以使用 WordPad 构建整个游戏,但我认为这不太现实。nFringe 支持智能感知(Intellisense)并能自动检测语法错误,从而为您节省宝贵的游戏开发时间。但是,nFringe 并非为 UDK 设计,其调试功能也无法与 UDK 一起使用。
可以从以下网址下载 nFringe:
在本教程中,我们将:
- 正确设置 nFringe 项目。
- 使用 UDK 编写一个简单的游戏。
- 编译并运行此游戏。
快速说明
我最初编写本教程时使用的是 UDK 的三月版本,后来的一些版本有所变化;最明显的是将目录 UTGame 改为 UDKGame。但是,UnrealScript 语言大部分保持不变(并增加了一些新功能,如 Flash GUI)。
Epic 官方网站上的编程指南/教程也比本教程最初撰写时有所改进。如果您对 UnrealScript 感兴趣,我建议您查阅它们(链接在底部)。
背景
在尝试使用 UnrealScript 进行开发之前,重要的是您必须具备一门编程语言(最好是面向对象)的先验经验。
同样重要的是,您需要了解 Unreal Editor 的基础知识,因为所有关卡创建都通过它完成。它并不难用,本教程对此的知识要求不高。
此时,您应该已经安装了 UDK 和 nFringe。我们将创建一个基本项目。
重要目录
导航到您安装 UDK 的目录,您应该会看到四个文件夹。
- Binaries - 包含编译 UnrealScript 和启动 Unreal Engine 3 以及 Unreal Editor 所需的所有重要二进制文件。
- Development - 包含所有基础的原始源代码(以 UnrealScript 编写),我们的工作将继承自这些代码。您游戏的所有原始脚本都应放置在此目录中。
- Engine - 请勿修改此文件夹,它不属于本教程的范围。
- UDKGame - 包含您游戏的编译脚本和资源(在新版本的 UDK 中已从 UTGame 更改)。
创建项目
注意:(UDK Base Directory) 指的是 UDK 的安装目录。
现在您已经安装了 nFringe,请启动 Visual Studio,并在 (UDK Base Directory)/Developement/Src 目录中创建一个新的解决方案,其中包含一个 UnrealScript 项目。它应该是一个 UnrealEngine 3 Licencee Project。
注意:项目目录非常重要,因为如果您的源代码不在正确的位置,UnrealScript 编译器将找不到它。
项目由 Visual Studio 创建后,关闭当前解决方案。导航到解决方案目录,并将所有文件(包括您的解决方案和项目文件)移动到 (UDK Base Directory)/Developement/Src。
双击解决方案文件打开 Visual Studio。Visual Studio 将无法找到您的项目,因此只需手动将其添加到您的解决方案中(添加 -> 现有项目...)。
如果这些步骤都正确完成,您应该会在项目中看到 UDK 的所有基础源代码,它们被组织在不同的文件夹中。
转到项目的属性页面,然后选择“常规”页面。在“脚本编译器”下,您应该会看到四个用户输入框,其中三个应该是灰色的。
确保您的目标游戏(在“游戏”下)设置为 UnrealEngine 3 Licensee。
现在转到 UCC 路径,并指定此文件:(UDK Base Directory)/Binaries/Win32/UDK.exe。这是 nFringe 在我们构建项目时将运行的 UnrealScript 编译器。
接下来,转到项目属性的“构建”页面,向下滚动到“脚本输出”,勾选“手动设置 UCC 输出目录”,然后输入此目录:(UDK Base Directory)\UDKGame\Script。
现在,深呼吸,我们已经完成了使用 UDK 构建项目的必要步骤。为了确保一切正常,请构建您的项目,如果成功,则表示您已准备好进行下一步。
UnrealScript 文件类型
UnrealScript 是一种面向对象的脚本语言。以下是 UnrealScript 中常用的文件类型:
- UC 文件 - 原始 UnrealScript,这些是基本的文本文件,包含编写的大部分代码。每个 .uc 文件包含一个类,并且该类必须与文件名相同。
- U 文件 - 编译后的 UnrealScript 模块,这些文件包含多个类,并且是 UnrealEngine 使用的文件。
- UCI 文件 - UnrealScript Include 文件,这些超出了本教程的范围。
- INI 文件 - 配置文件。
创建 UnrealScript 模块
您的项目应包含多个文件夹。这些文件夹中的每一个都包含一个 UnrealScript 模块,即一组 UnrealScript 类。
在您的项目中创建一个新文件夹,并将其命名为“MyGame
”。这将是我们存储所有类的模块。
在每个模块中,都有一个名为“Classes”的文件夹,这非常重要。没有此文件夹,UDK 编译器将无法找到您的 UnrealScript
类。请在您的“MyGame”模块文件夹中创建一个名为“Classes”的文件夹。我们将把所有代码放在此文件夹中。
编写我们的代码
在您的“Classes”文件夹中创建 3 个空的 UnrealScript 文件,分别命名为“UPawn”、“UController”和“UGameInfo”。
UPawn
- 这是我们将用于玩家的类。(继承自GamePawn
)UController
- 这是充当玩家控制器的类。(继承自GamePlayerController
)UGameInfo
- 包含我们游戏所有信息的类。(继承自GameInfo
)
打开您的 UGameInfo.uc 文件,它看起来应该像这样:
class UGameInfo extends Object;
DefaultProperties
{
}
这段代码定义了一个名为 UGameInfo
的类,它是 Object 的子类。DefaultProperties
块是每个类的一部分,正如其名称所示,它定义了一个类的所有默认属性并向类添加组件。DefaultProperties
块中的行后面没有分号。
当然,我们不希望 UGameInfo
类成为 Object
的子类,我们希望它是 GameInfo
的子类,所以将 Object
替换为 GameInfo
。
现在您的 UGameInfo.uc 文件应该看起来像这样:
class UGameInfo extends GameInfo;
DefaultProperties
{
}
现在,在继续处理其他文件之前,请快速添加这些默认属性:
class UGameInfo extends GameInfo;
DefaultProperties
{
DefaultPawnClass = class'MyGame.UPawn'
PlayerControllerClass = class'MyGame.UController'
bDelayedStart = false
}
这告诉我们的 UGameInfo
类,我们将用于游戏的 Pawn 类是 UPawn
,我们将使用的控制器类是 UController
。
关于类类型的说明
正如您在我的示例中看到的,当您想将一个类类型用作变量时,您可以使用 class
关键字,然后是模块名称,后跟类名。例如,如果我想引用 Engine 模块中的 GameInfo
类,我会这样写:
class'Engine.GameInfo'
但是,如果类在与您的脚本相同的模块中,则无需指定模块。
class'UPawn'
添加对象
好了,现在打开您的 UPawn.uc 文件。
将父类更改为 GamePawn
,然后我们将为 UPawn
添加一个碰撞圆柱体。
代码看起来应该像这样:
class UPawn extends GamePawn;
DefaultProperties
{
begin object Class=CylinderComponent Name=CylComponent
CollisionRadius =+ 20.0
CollisionHeight =+ 40.0
end object
Components.Add(CylComponent)
CylinderComponent = CylComponent
}
这段代码定义了一个 CylinderComponent
类的对象,名为 CylComponent
,半径为 20,高度为 40,然后将此组件添加到 Pawn
的组件中,并将 CylinderComponent
设置为 CylComponent
。
现在我们将为 Pawn 添加动态光照环境。
class UPawn extends GamePawn;
DefaultProperties
{
begin object Class=CylinderComponent Name=CylComponent
CollisionRadius =+ 20.0
CollisionHeight =+ 40.0
end object
Components.Add(CylComponent)
CylinderComponent = CylComponent
begin object Class=DynamicLightEnvironmentComponent Name=UPawnEnvironment
bSynthesizeSHLight = true
end object
Components.Add(UPawnEnvironment)
LightComponent = UPawnEnvironment
}
接下来,转到 UController.uc 文件,并确保它看起来像这样:
class UController extends GamePlayerController;
DefaultProperties
{
}
就是这样!您已经创建了一个简单的游戏,您唯一能做的就是跑和跳。做得好!遗憾的是,您仍然需要编译它并调整 Unreal Engine 3 的配置来运行此代码。
编译
这一步相对简单,只需覆盖 UDK 附带的默认 .ini 文件。
转到 (UDK Base Directory)/UDKGame/Config。
您应该会看到一个名为 DefaultEngine.ini 的文件。
注意:您应该备份所有默认配置文件,以防万一您搞砸了;但是,您也可以删除配置文件,UDK 会自动在 config 目录中重新创建默认配置文件。
打开 DefaultEngine
配置文件,向下滚动直到看到此部分:
[UnrealEd.EditorEngine]
EditPackagesOutPath=..\..\UTGame\Script
FRScriptOutputPath=..\..\UTGame\ScriptFinalRelease
+EditPackages=UDKBase
+EditPackages=UTGame
+EditPackages=UTEditor
+EditPackages=UTGameContent
AutoSaveDir=..\..\UTGame\Autosaves
InEditorGameURLOptions=?quickstart=1?numplay=1
在 +EditPackages=UTGameContent
之后插入此行。
+EditPackages=MyGame
这将把 MyGame
模块包含在编译中。
现在您应该能够构建项目,并且相应的“MyGame.u”文件应该会出现在您的 UCC 输出目录 (UDK Base Directory)/UDKGame/Script 中。
配置 UDK
如果您已经尝试运行,您可能会注意到 UDK 在运行时实际上并未在您的类中使用。更改此设置很简单,它涉及更改 UDK 附带的默认配置文件。
转到 (UDK Base Directory)/UDKGame/Config。
您应该会看到名为 DefaultGame.ini 的文件。
转到配置文件中的 Engine.GameInfo
部分,并将其更改为:
[Engine.GameInfo]
DefaultGame=MyGame.UGameInfo
DefaultServerGame=MyGame.UGameInfo
PlayerControllerClassName=MyGame.UController
GameDifficulty=+1.0
MaxPlayers=32
DefaultGameType="UTGame.UTDeathmatch";
+DefaultMapPrefixes=(Prefix="DM",bUsesCommonPackage=FALSE,GameType="UTGame.UTDeathmatch")
+DefaultMapPrefixes=(Prefix="CTF",bUsesCommonPackage=FALSE,
GameType="UTGameContent.UTCTFGame_Content")
+DefaultMapPrefixes=(Prefix="VCTF",bUsesCommonPackage=FALSE,
GameType="UTGameContent.UTVehicleCTFGame_Content")
现在,您可以创建一个地图,然后在其上进行游戏来测试它。游戏中应该没有 HUD。
最终评论
我以后会写一篇教程的第二部分,介绍如何:
- 使用物品管理器。
- 创建拾取物工厂。
- 检查胜利条件。
- 结束游戏。
《Mastering Unreal Technology Volume III》这本书也即将上市,将专注于 UnrealScript。
但在此之前,请查看一些 Unreal 网站: