65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.40/5 (7投票s)

2010年6月25日

CPOL

9分钟阅读

viewsIcon

96564

本教程将介绍如何设置 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 网站:

© . All rights reserved.