UDK补充性脚本

修改
鏉ユ簮: 上帝宝贝 浏览 8353 日期 2011-08-27 0

  • 补充性脚本
  • 创建自定义Kismet循序对象
  • 指南A.1——创建自定义Kismet循序对象,第一部分:初始脚本组件
  • 指南A.2——创建自定义Kismet循序对象,第二部分:设置默认属性
  • 指南A.3——创建自定义Kismet循序对象,第三部分:添加功能
  • 指南A.4——创建自定义Kismet循序对象第四部分:保存至UnrealScript并调整.INI文件
  • 指南A.5——创建一个可放置的WaterVolume(水体积)
  • 指南A.6——创建一个会爬梯子的自定义Pawn
  • 指南A.7——创建一个使用自定义Pawn的自定义Gametype

补充性脚本

创建自定义Kismet循序对象

关卡设计师时而会遇到这种尴尬情况:您想运用Kismet进行一些工作,但目标却超出了默认的节点设置能力范围。此时,若您知道怎样编写循序对象来实现各种功能,就变得有用了。所幸在UnrealScript中,这一步骤变得易如反掌。诚然,本书的目的不注重于使用Unreal的编码功能,但是考虑到此话题十分有用,我们决定先为您举一个简单的例子来启发一下。

若您觉得此篇指南颇有价值,而且也愿意投入时间来拓展自己的编程技能,您就会发现,开发自己的Kismet节点可以大有成就。

在这个简单示例中,我们要创建一个数学节点对两个浮点变量进行加、减、乘、除的运算。本指南会将创建工作分解为包含脚本各个方面的几个步骤,每一节中创建的脚本都带有描述文字,说明此节脚本的功用。

然而,正如上文所述,本书的目的并不在于使您成为一个脚本编写专家。即使从未进行过编程工作,您还是可以跟上本指南进度的。不过在对编程常识一无所知的情况下,确实会无法完全掌握本篇指南所传授的技巧。

指南A.1——创建自定义Kismet循序对象,第一部分:

初始脚本组件

注意:为顺利完成本指南的工作,您需要一个文本编辑程序,比如Windows自带的记事本(Notepad)或者ConTEXT。

1.首先,请打开文本编辑程序。

2. 键入下列文本:

class SeqAct_MathOperations extends SequenceAction;

语句的第一行为循序对象创建了新的类(Class)。这个类应命名为SeqAct_MathOperations它来自于Kismet循序对象主要的类——SequenceAction类。切记在句末加上分号。切记切记!

3.为了便于阅读在此新添一行然后键入下列文本:

enum Operation

{

OPER_Add,

OPER_Subtract,

OPER_Multiply,

OPER_Divide

};

此节代码创建了一个enumerator(称为Operation),它可以保存每一个数学运算的名称。对于运算本身而言,这些名称毫无用处。您可以把它们看作是一张用户可见的列表,以便使用户了解正在执行的运算操作。切记在实际列表的开始和完结处都要使用大括号,并在第二个大括号之后使用分号!

4 现在我们来创建用于脚本的变量。在enumerator大括号下面几行,添加以下文本。

Var () Float A B;

[next]

var Float Result;

var () Operation MathOperation;

第一行创建了名称为A和B的两个变量。在“var”之后加上的左右圆括号表明此类变量是可编辑的,意味着这些变量正在等待某种输入。这些变量是浮点,也就是带有小数点的数字。请注意在语句结束处加上分号。

第二行创建了另一个名为Result的变量。该变量是不可编辑的。这也是为什么语句开头没有左右圆括号的原因。它不需要进行编辑,仅仅因为它不需要编辑(没有别的理由)。运算结果将作为节点行为的结果而创建出来。您当然不希望数学问题的答案是可编辑的。再一次提醒您:在末尾加上分号。

第三行创建了第四个变量,名称为MathOperation。此变量从列表中调用Operation enumerator(运算计数器)来保存其中的一次运算。然而,除非我们使用执行功能,否则此次操作不会产生任何效果。

5. 现在请保存您的文档文件。此时,文件名称无关紧要,只要保存该文件以防丢失。

指南A.2——创建自定义Kismet循序对象,第二部分:

设置默认属性

1. 打开指南A.1中的文本文件。请添加几行空行以留些空间,因为我们要在本节指南中学习脚本的功能(functionality)。

2. 键入下列文本:

defaultproperties

{

}

本语句创建了包含属性的脚本部分。

注意:在本节指南中每隔一行的语句都要输入在大括号内。

3. 在大括号中加入下列语句:

defaultproperties

{

ObjName=”Operations”

ObjCategory=”MasteringUnreal”

}

第一行创建了在Kismet右键关联菜单中出现的本循序对象的名称。在此情况下,列表中出现的节点就是Operations的形式。

第二行指定了将会出现循序对象的类别。在此情况下,它会成为一个叫做MasteringUnreal的新类别。

4. 在“ObjCategory=”MasteringUnreal””的下面一行添加以下语句:

defaultproperties

{

ObjName=”Operations”

ObjCategory=”MasteringUnreal”

OutputLinks(0) = (LinkDesc=”Out”)

}

这一行语句为节点创建了一个命名为Out的单独输出链接。我们无需创建一个输入链接,因为它继承了原始类(class)的数据。理论上,我们可以在(0)的位置用与(1)相似的语句行添加出更多的输出链接。

5. 在“OutputLinks(0) = (LinkDesc=”Out”)”的下面一行添加下列语句:

defaultproperties

{

ObjName=”Operations”

ObjCategory=”MasteringUnreal”

OutputLinks(0) = (LinkDesc=”Out”)

VariableLinks.Empty

VariableLinks(0) = (ExpectedType=class’SeqVar_Float’LinkDesc=”A”PropertyName=A)

[next]

VariableLinks(1) = (ExpectedType=class’SeqVar_Float’LinkDesc=”B”PropertyName=B)

VariableLinks(2) = (ExpectedType=class’SeqVar_Float’LinkDesc=”Result”bWriteable=TruePropertyName=Result)

}

第一行用于移除可能会与原始类同时出现的任何变量链接信息。

第二行用于创建首个变量链接。我们建立了该变量所需的数据类型,此处即浮点。我们还要创建一个该链接出现时的名称,命名为A。最后,我们要在脚本中建立一个变量,当我们向变量链接发送信息时,就在脚本中写入此变量。

第三行是对第二行的复制。将LinkDesc和PropertyName属性从原来的A设置为B。这样就非常简便地创建了第二个变量链接。

第四行是对第三行的复制,将LinkDesc和PropertyName属性再次改变为Result,添加bWriteable(可写入)属性并将其设置成true(是)。这一点对于允许脚本对变量具有写入功能是非常重要的。

6.保存您的文本文件。

指南A.3——创建自定义Kismet循序对象,第三部分:添加功能

1. 打开已存档的文本文件。

2. 在变量列表的下方,defaultproperties(默认属性)一行的上方,添加下列语句:

event Activated()

{

}

我们利用Activated(已激活)事件来设定功能框架。我们可以使用此事件是因其衍生自SequenceAction(循序动作) 类。这基本上意味着:由于在Kismet中插入一个事件,那么无论何时发送一个信号到该节点上,都将运行大括号中的任何代码。

3. 在大括号中,添加下列语句:

event Activated()

{

switch (MathOperation)

{

}

}

我们现在正在新建一个基于MathOperation变量的开关/案例(switch/case)陈述。现在不必担心此步骤的真实意义(下文中会进行解释);只要牢记此陈述在“event Activated()”行中有其自身的大括号分层就可以了。

4. 现在我们要创建出一个运算行为,决定从enumerator列表中选中OPER_Add时产生的状况。

Event Activated()

{

switch (MathOperation)

{

case OPER_Add:

Result=A+B;

break;

}

}

这几行的作用是当用户选择了加法运算时,与之挂钩的运算行为。请注意在“case OPER_ADD”一行后面有一个冒号(而不是分号)。还有一个“break”(中断)陈述位于数学等号的后面。这样就防止了在加法运算发生完毕后,其它的后续数学运算对此变量执行任何操作。

5. 现在需要为另一个数学运算设定以下行为。请添加下列语句:

注意:利用复制/粘贴,来处理下面几行语句是最便捷的!

event Activated()

{

switch (MathOperation)

[next]

{

case OPER_Add:

Result=A+B;

break;

case OPER_Subtract:

Result=A-B;

break;

case OPER_Multiply:

Result=A*B;

break;

case OPER_Divide:

Result=A/B;

break;

default:

Result=0;

break;

}

}

这些语句为接下来的数学运算建立了运算行为。请注意在最后又添加了一个默认案例,这是预防当事件中出现某些错误时,将Result变量值设回默认值0。

6. 若您没有保持高度注意力,下面的部分会变得很难理解。我们需要在Switch大括号的后方、event大括号的前方添加一些行为代码,允许原始类(original class)执行某些功能,并通过节点发送出任何必要的信息。键入下列语句:

注意:在此步骤中,您要添加的只有最底部的语句。其它的代码都是为了使我们的思路更为清晰而从上一语句章节中复制而来的。

event Activated()

{

switch (MathOperation)

{

case OPER_Add:

Result=A+B;

break;

case OPER_Subtract:

Result=A-B;

break;

case OPER_Multiply:

Result=A*B;

break;

case OPER_Divide:

Result=A/B;

break;

default:

Result=0;

break;

}

Super.Activated();

PopulateLinkedVariableValues();

OutputLinks[0].bHasImpulse=True;

}

第一行“Super.Activated()”,使得原始类(original class)执行为了让一切运算顺利进行的任意必要功能。

第二行语句会向Kismet序列中的已链接变量发送出之前创建的数学运算结果的变量值。可以将其看作为是更新Kismet编辑器中附属于该节点的任何变量。

第三行语句仅是用于激活与该特定节点的Out输入相连接的任意节点。

7. 脚本编辑已经完成了(当然如果有打字错误就不算了)。若存在一些Bug,请不要担心。Unreal会在稍后汇编时向您显示出产生错误的地方,所以您能够很容易的回头来修复它们。

保存您的文本文件。

最终的脚本应如下所示:

class SeqAct_MathOperations extends SequenceAction;

enum Operation

{

OPER_Add,

OPER_Subtract,

OPER_Multiply,

OPER_Divide

};

var () Float A B;

var Float Result;

var () Operation MathOperation;

event Activated()

{

switch (MathOperation)

{

case OPER_Add:

[next]

Result=A+B;

break;

case OPER_Subtract:

Result=A-B;

break;

case OPER_Multiply:

Result=A*B;

break;

case OPER_Divide:

Result=A/B;

break;

default:

Result=0;

break;

}

Super.Activated();

PopulateLinkedVariableValues();

OutputLinks[0].bHasImpulse=True;

}

defaultproperties

{

ObjName=”Operations”

ObjCategory=”MasteringUnreal”

OutputLinks(0) = (LinkDesc=”Out”)

VariableLinks.Empty

VariableLinks(0) = (ExpectedType=class’SeqVar_Float’LinkDesc=”A”PropertyName=A)

VariableLinks(1) = (ExpectedType=class’SeqVar_Float’LinkDesc=”B”PropertyName=B)

VariableLinks(2) = (ExpectedType=class’SeqVar_Float’LinkDesc=”Result”bWriteable=TruePropertyName=Result)

}

指南A.4——创建自定义Kismet循序对象第四部分:保存至UnrealScript并调整.INI文件

1. 继续前一指南,打开您的文本文件。

2. 第一步是保存文件,使Unreal懂得这是一个待编辑的UnrealScript。首先打开文本编辑器的Save(保存)对话框。打开位于UnrealEngine3安装目录下的Src文件夹。在此文件夹内,新建一个命名为MasteringUnreal的文件夹。打开这个子文件夹,再创建另一个文件夹并命名为Classes。打开最后这个文件夹,将您的文件保存为SeqAct_MathOperations.uc。

您的最终路径可能如下显示:

C:UnrealEngine3DevelopmentSrcMasteringUnrealClassesSeqAct_MathOperations.uc

注意:最终的文件名称必须与脚本创建伊始时的类名称保持一致。并且注意在该文件名的后缀名是.UC!请勿将您的文件保存为TXT 格式的文件。

3. 现在需要调整ExampleEngine.INI文件。不过首先还是要确保无论是《Unreal》游戏还是UnrealEngine3 都不在运行状态。若正在运行,就会覆盖您的所有更改!

4. 打开ExampleEngine.INI文件,该文件应该存放在您的UnrealEngine3 安装目录下的Config文件夹内。

5. 在INI文件内,找到EditPackages 语句列表的位置。此处应该有若干行语句,指定了当Unreal启动时自动加载的文件包名称。在列表末端,插入下面的新语句:

[next]

EditPackages=MasteringUnreal

请注意这就是在Src文件夹内创建的文件夹的名称。保存然后关闭INI文件。

6. 运行UnrealEd。您会收到一条信息,警告脚本已过期。点击Yes进行重建(rebuild)。

注意:若您的代码中存在任何Bug,就会出现在重建窗口(rebuild window)中。

7. 若进展顺利,您就可以运行UnrealEd了。右击并从关联菜单中选择MasteringUnreal > Operations。如此,就在Kismet中创建了一个新的可用节点,可以连接任意的两个值,也可以在节点属性中改变数学运算。

<<<< 指南结束

以上述示例为基础,您就可以自行尝试新建循序对象了。若您计划大量地使用循序对象功能,那么在真实源代码(Unreal游戏源代码)中而非通过Unreal脚本中应用循序对象会更为有效。当然,即便您无法获得或者根本不想了解Unreal源代码,脚本仍然可以为您提供一种快捷有效的接近游戏原型(prototype)的途径来创建所需的循序对象。

指南A.5——创建一个可放置的WaterVolume(水体积)

Unreal使用WaterVolume(水体积)实现了玩家的随意畅游,但在编辑器内的默认状态下,volume(体积)是不可放置的。正因如此,创建出自定义的可放置WaterVolume class(水体积类)就变得极有必要,它从基础WaterVolume(水体积)类别扩展而来的,并能将我们自己的WaterVolume(水体积)变得可放置。 这是一个非常简单的过程,它仅仅只需要说明Placeable specifier的类别。而其他所有功能都继承于这个基本类别。

若您不熟悉编辑脚本,不用担心。您还是可以很容易的进行下列的设置:

1. 首先,确定您有一个文本编辑程序。一般来说,可以选择使用ConTEX或者Notepad。它们中的任意一个都可以为我们所用。

2. 这个类别中的第一行就是对类别的说明。我们在此规定自定义WaterVolume(水体积)的名字,同样还是从我们的类别延伸过来的,或者继承了其功能的类别所在的地方,以及可以选择添加的任意specifiers,例如前面提到的the Placeable specifier。输入下列语句:

class MU_WaterVolume extends WaterVolume

从左到右,这一行首先规定了我们正在创建一个新的“类”。然后指定了这个新和类名称MU_WaterVolume(水体积)。其中的关键字“extends”意味着,这个类别要继承它的功能和成员,例如来自从另一个类别的变量和默认属性。接下来的是类别的名称,WaterVolume(水体积),这个类别应继承于它。

3. 现在,按下回车键(Enter),进入下一行,输入下列语句:

Placeable;

由于文本空格了好几行,所以此处才是继续之前输入的编辑码的第一行。用空格是为了阅读更方便,我们交错排列这一行,使它看起来更容易辨识为第一行的继续。如此也就更容易确认新类别的名称和源类别,也不会和一堆specifiers拥挤在一起。

[next]

这一行告诉了Unreal:可以将这个类别放置在编辑器的地图中。此行末尾是一个分号,意即这是一个执行命令的结束。

4. 按两次回车键,跳过一行,输入下列语句:

defaultproperties

{

}

通常,这个默认属性部分,就是给从属于类别的变量值赋上特别的初始值的地方。在我们的案例中,当我们只是从源类别中继承所有的值时,不会设置任何属性。添加这一部分只是为了完成性,所以省略这一部分也不会造成任何问题。

5. 就编辑码而言,这一是完成脚本的最后一步。您的最终脚本应看起来像这样:

class MU_WaterVolume extends WaterVolume

Placeable;

defaultproperties

{

}

6. 下一步即保存文件,使得Unreal将它编辑成一个脚本文件包或者.u文件。要达到这个目的,首先,您必须创建一对文件夹。找到位于UnrealEngine3安装文件的Development目录下的Src文件夹。在该文件中,创建一个文件夹,命名为MasteringUnreal,当然,若已存在MasteringUnreal文件夹,就不需新建了。打开新的文件夹,创建另一个命名为Classes的文件夹,同上,若该文件夹已存在,也无须新建了。最后,保存文本文件至Classes文件夹中,并命名为MU_WaterVolume(水体积).uc。

该文件的最终路径应看起来如下:

C:UNrealEngine3DevelopmentSrcMasteringUnrealClassesMU_WaterVolume.uc

注:务必使该文件的名称和创建的类别名称一致,并让该文件以.uc扩展名一起保存。只有这样,Unreal才能识别该文件是一个需要编辑的脚本文件。

7. 现在,为了让Unreal搜索您已创建的脚本,必须在ExampleEngine.ini文件中创建一个条目,在对该文件作出修改之前,您必须确定关闭了Unreal或者UnrealEd的所有内存块(instances),因为当这些内存块运行时,它们会覆盖您做的任何修改。

8. 打开ExampleEngine.ini文件,其位置在UnrealEngine3安装文件中的Config文件夹内。

9. 在这个文件中,找到EditPackages 条目所在的部分。该处会有一些条目说明了当Unreal启动时,会安装哪一个文件包。更重要的是,当发现有文件超过时效期时,这里列出的文件包将会进行编辑。也就意味着,UnrealScript (.uc)文件比同这些脚本结合的脚本文件包(.u)要新。

在最后一个EditPackages条目后面,插入一行新的语句:

EditPackages=MasteringUnreal

注:这里输入的文件包的名称,应同保存.uc文件的Src文件夹内创建的子文件夹名称一致。

一旦创建了新的条目,保存并关闭ExampleEngine.ini文件。

10. 启动UnrealEd。您会接受到一条消息,通知您脚本已过期,并询问您要采取什么行动。点击Yes重建Unreal,或者编辑脚本。由于只有存在新文件的文件包才会进行编辑,所以这一进程不会耗时太长。

[next]

注:若在编辑码中存在任何漏洞或者错误,这个编辑窗口会告诉您它们的位置(文件名和第几条命令行),以及漏洞和错误是什么。

11. 假设没有任何错误,您现可以准备启动UnrealEd并检测新的Volume。当您右击工具栏中Add Volume按键时,您会看到一个命名为MU_WaterVolume(水体积)的新Volume,当进入该Volume时,玩家可以随心畅游。

指南A.6——创建一个会爬梯子的自定义Pawn

默认的Pawn类别不具备攀爬的能力。为了具备这样的能力,必须创建一个新的Pawn类别,该类别继承了默认的Pawn类别,由于它在新的类中设定了默认属性,这就比Placeable WaterVolume(水体积)类别涉及的更多。

您若不熟悉编辑脚本,不用担心。您还是可以很容易的进行下列的设置:

1. 首先,确定您有可用的文本编辑程序。一般来说,您可以选择使用ConTEXT或者Notepad。它们中的任意一个都可以为我们的目的服务。

2. 这个类别中的第一行是对类别说明。这是我们指定自定义Pawn的名字的位置,同样还是从我们的类别延伸过来的,或者继承其功能的类别所在的地方。输入下列语句:

class MU_Pawn extends ExamplePawn;

从左到右,这一行首先规定了我们正在创建一个新的“类”。然后指定类名称为MU Pawn。关键字“extends”告诉关卡设计师,这个类别要继承它的功能和成员,例如从另一个类别来的变量和默认属性。接下来的是类别的名称,ExamplePawn,这个类别应继承于它。这一行结尾处是一个分号,它告诉了关卡设计师:这是这一条执行命令的结束。

3. 按两次回车键,跳过一行,然后输入下列语句:

defaultproperties

{

}

通常,这个默认属性部分,就是给从属于类别的变量值,赋予特别的初始值的地方。

4. 攀爬梯子的功能设置在Pawn类别中,但是,只有CanClimbLadders属性设置为True(是),只有这样才能激活该项功能,而事实上,CanClimbLadders属性并未设置为True(是)。在defaultproperties部分,我们开始设置属性。在{和}之间输入下列语句:

defaultproperties

{

bCanClimbLadders=True

}

您也许注意到了,这一行语句结尾没有分号。默认属性中的语句是不会以分号结尾的。您仅只需按回车键开始新的一行,以此表示执行命令中的新语句。

5. 就编辑代码而言,脚本已经编辑完成了。您的最终脚本看起来应像这样:

class MU_Pawn extends ExamplePawn;

defaultproperties

{

bCanClimbLadders=True

}

6. 下一步就是保存文件,使得Unreal可以将它编辑成一个脚本文件包或者.u文件。要达到这个目的,您首先必须创建一对文件夹。找到位于UnrealEngine3安装文件的Development目录下的Src文件夹。在该文件中,创建一个文件夹,命名为MasteringUnreal,当然,若已经存在一个MasteringUnreal文件夹,就不用新建了。打开新的文件夹,新建另一个文件夹命名为Classes,同上,若该文件已经存在,也就不用新建了。最后保存文本文件至Classes文件夹中,并命名为MU_Pawn.uc 。

[next]

文件的最终路径应看起来像这样:

C:UNrealEngine3DevelopmentSrcMasteringUnrealClassesMU_Pawn.uc

注:务必要让该文件的名称和创建的类别名称一致,并让该文件以.uc扩展名一起保存,只有这样才能让Unreal识别该文件为一个需要编辑的脚本文件。

指南A.7——创建一个使用自定义Pawn的自定义Gametype

现在我们已经创建了自定义的Pawn类别,我们需要找到一个方法,让它能在游戏运行时,代替默认的Pawn类别。我们要创建一个使用自定义Pawn类别的新游戏规则,然后把这个新游戏规则规定成当游戏运行时默认的游戏规则。

1. 打开文本编辑程序。

2. 这个类别中的第一行就是类别说明。我们在此指定自定义Pawn类别的名称,同样还是从我们的类别延伸过来的,或者继承其功能的类别所在的位置,输入下列语句:

class MU_GameInfo extends ExampleGameInfo;

从左到右,这一行首先规定了我们正在创建一个新的“类”。然后指定了该新类别的名称MU GameInfo。关键字“extends”告诉关卡设计师,这个类别要继承它的功能和成员,例如来自另一个类别的变量和默认属性。接下来的是类别的名称,ExampleGameInfo,这个类别应继承于它。这一行结尾处是一个分号,它意味着:这是这一条执行命令的结束。

3. 按两次回车键,跳过一行,然后输入下列语句:

defaultproperties

{

}

通常,这个默认属性部分,就是给从属于类别的变量值,赋予特别的初始值的地方

4. 该属性表明了使用Pawn类别的游戏规则叫做DefaultPawnClass。在defaultproperties部分内,我们来设置属性。在{和}之间输入下列语句:

defaultproperties

{

DefaultPawnClass=class'MasteringUnreal.MU_Pawn'

}

初看起来,这个语句的结构让人觉得难懂,实际上,它很明了。DefaultPawnClass变量是“类型”类,我们用下列的语句结构来规定“类型”。

class'Package.Group.Name'

在我们的案例中,“package”是包含类别或者的脚本文件包的名称,或者是MasteringUnreal的名称。“Group”是可选择的参数,因为并不是所有的内容都回包含在一个Group里。自定义Pawn类别没有任何的分组(Group),所以这里省略了。“name”就是这个类别的名称,也即MU_Pawn。

5. 就编辑代码而言,脚本已经编辑完成了。您的最终脚本应看起来像这样:

class MU_ GameInfo extends ExampleGameInfo;

defaultproperties

{

DefaultPawnClass=class'MasteringUnreal.MU_Pawn'

}

6. 下一步是保存文件,使得Unreal可以将它编辑成一个脚本文件包或者.u文件。要达到这个目的,首先,您必须创建一对文件夹。找到位于UnrealEngine3安装文件中Development目录下的Src文件夹。在该文件中,创建一个文件夹,命名为MasteringUnreal,当然,若已经存在一个MasteringUnreal文件夹,就不用新建了。打开新的文件夹,新建另一个文件夹命名为Classes,同上,若该文件已经存在,也就不用新建了。最后保存文本文件至Classes文件夹中,并命名为MU_GameInfo .uc。

[next]

文件的最终路径应看起来像这样:

C:UNrealEngine3DevelopmentSrcMasteringUnrealClassesMU_GameInfo.uc

注:务必要让该文件的名称和创建的类别名称一致,并让该文件以.uc扩展名一起保存,只有这样才能让Unreal识别该文件为一个需要编辑的脚本文件。

7. 现在,为了让Unreal知道去搜索您已创建的脚本,必须在ExampleEngine.ini文件中创建一个条目,在对该文件作出任何修改之前,确定关闭了Unreal或者UnrealEd的所有内存块(instances),因为当这些内存块运行时,它们会覆盖您做的所有修改。

8. 打开ExampleEngine.ini文件,其位置在UnrealEngine3安装文件中的Config文件夹内。

9. 在这个文件中,找到EditPackages 条目所在的部分。哪里会有一些已存在的条目说明了当Unreal启动时,会安装哪一个文件包。更重要的是,当发现有文件超过时效期时,这里列出的文件包将会进行编辑。这就意味着,UnrealScript (.uc)文件比同这些脚本结合的脚本文件包(.u)要新。若已经有一个MasteringUnreal文件包条目在那个地方,就可以跳过这一步。

在最后一个EditPackages条目后面,插入一行新的语句:

EditPackages=MasteringUnreal

注:这里输入的文件包的名称,应同保存.uc文件的Src文件夹内创建的子文件夹名称一致。

一旦创建了新的条目,就保存并关闭ExampleEngine.ini文件。

10. 启动UnrealEd。您会接受到一条消息,通知您脚本已过期,并询问您要采取什么行动。点击Yes重建Unreal,或者编辑脚本。只有存在新文件的文件包才会进行编辑,所以这一进程不会耗时过长。

注:若在编辑码中存在任何漏洞或者错误,这个编辑窗口会告诉您它们的位置(文件名和第几条命令行),以及漏洞和错误是什么。

11. 假设没有任何错误,您现在就可以设置默认的游戏规则了。打开位于Config文件夹内的ExampleGame.ini文件,找到一行包含下列内容的命令行:

DefaultGame=ExampleGame.ExampleGameInfo

把这一行改成新的游戏规则的类别。完成后,它看起来应该像这个样子:

DefaultGame=MasteringUnreal.MU_GameInfo

保存并关闭该文件。

12. 现在您可以启动UnrealEd。当您玩到一个包含LadderVolumes的地图时,玩家应该就可以毫无困难的进行攀爬。

,

评论

{{ username ? username.charAt(0).toUpperCase() : '?' }}
Ctrl+Enter 发布
{{ (c.username || c.author_name || '?').charAt(0).toUpperCase() }}
{{ c.username || c.author_name }} {{ Utils.formatDate(c.created_at) }}