UnrealScript语言参考

2026/1/19 7:02:11

为了管理时间,Unreal将游戏播放的每秒钟分隔为\。一个Tick是关卡中所有物体更新所使用的最小时间单位。一个tick一般是一秒钟的1/100到 1/10。Tick时间仅受到CPU功率的限制,机器速度越快,tick持续时间越短。

在UnrealScript中的某些命令的执行只需要使用零tick(也就是:它们的执行没有占有任何游戏时间),也有些命令需要占用很多ticks。需要占用游戏时间的函数称为\functions(潜伏的函数)\。一些latent functions函数的例子包括 Sleep , FinishAnim , and MoveTo 。UnrealScript中的Latent functions仅可以从在一个状态的代码中被调用(所以也称作\code(状态代码)\,而不能从一个函数的代码中(包括在一个状态中定义的函数)被调用。

当一个actor在执行一个latent函数,那个actor的状态执行不会继续直到latent函数执行完毕。然而,其它的actor或者VM可能会调用actor内部的函数。最终的结果是所有的UnrealScript的函数可以在任何时间被调用,甚至在latent 函数没有执行完毕的情况下。

按照传统的编程术语来说,UnrealScript就像在关卡中的每个物体有它们自己的执行\线程)\一样工作。在内部,Unreal不使用Windows线程,因为那将是非常低效的(Windows 95和Windows NT不能高效地处理同时发生的成千上万的线程)。然而,UnrealScript 可以模拟线程。虽然这个事实对于UnrealScript代码是透明的,但当您书写和UnrealScript交互的C++代码时则变得非常显然的。

所有的UnrealScripts将彼此独立地执行,如果有100个鬼怪正在关卡中走动,那么所有的这100个鬼怪的脚本在每个\中都正在同时地且独立地执行着。

对象层次

在使用UnrealScript进行工作之前,理解Unreal中物体的高层次的关系是非常重要的。Unreal的架构和其它大多数的游戏架构是有较大的背离的:Unreal是完全地面向对象的(非常像 COM/ActiveX),它有一个定义明确的对象模型,可以支持高层次的面向对象的概念比如对象图、序列化、对象生命周期和多态性。从游戏历史上来说,尽管很多游戏比如Doom和Quake,已经证明在内容方面有较大的可扩展性,但大多数游戏都被设计成为集成化的,它们的主要功能都是被硬编码的并且是在对象的层次上不能扩展的。Unreal的面向对象的形式有一个很大的好处:主要的新功能和对象类型可以在运行时添加到Unreal中,并且这个扩展是以划分子类的方式进行的,而不是(比如)通过修改一串已有的代码。这种扩展的形式是非常强大的,因为它鼓励Unreal团队共同来创建可以所有人都可以操作的改善。

Object是Unreal中所有对象的父类。在Object类中的所有函数可以在任何地方访问,因为任何东西都继承于Object。Object是一个抽象的基类,它没有做任何有用事情。所有的功能都是由子类提供,比如Texture (一个贴图),TextBuffer(文字块)和Class (它描述了其它对象的类)。

Actor(继承Object)是Unreal中所有独立运行的游戏对象的父类。Actor包含了所有的一个物体所需要的用于四处运动、和其它物体进行交互、影响环境及做其它与游戏相关的有用的事情的功能。 x

Pawn(继承Actor)是Unreal中所有的可以使用高层次AI和玩家控制的创造物和玩家的父类。

Class (继承 Object)是一种描述对象的类的特殊类型的object。刚看到时可能是令人疑惑的:一个类是一个对象,而其一个类描述某些的对象。但是这概念是合理的,并且在很多情况下您将会用到Class的对象。例如,当你在UnrealScript产生一个新的actor,你可能会通过Class对象来指定actor的类。

使用UnrealScript,你可以为任何Object类书写代码,但是99%的时候您都是在为从Actor继承的类来写代码。大多数有用的UnrealScript功能是游戏相关的并且是处理actors的。 类

每个脚本明确地对应一个类,并且脚本是通过声明类、类的父类及任何和该类相关的其它附加信息开始的。最简单的形式是:

class MyClass extends MyParentClass;

这里我声明了一个名为\的新类,它继承了\类的功能。另外,这个类存储在名为\的包中。

每个类继承它父类的所有的变量、函数和状态。然后它可以添加新的变量声明、添加新的函数(或者重写已有函数)、添加新的状态(或者为已有的状态添加功能)。

在UnrealScript中典型的设计类的方法是构造一个继承了具有您所需要的大部分功能的现有类(比如Pawn类,即所有怪物的基类)的新类(比如一个‖人身牛头怪物‖)。使用这个方法,你从来不需要重新发明新的东西---你可以简单地增加您想自定义的新功能,然而保持所有你不需要进行自定义的现有的功能。这个方法在Unreal中实现AI时显得尤其有用,因为在内置的AI系统中提供了大量的基础功能,您可以把它们作为您自定义的创造物的组成部分。

类的声明可以带有几个可选的影响类的修饰符:

Native(包名称)

意味着―这个类使用C++作为幕后支持‖。Unreal期望native类在.EXE文件中包含着一个C++实现。只有native类可以声明native函数或者实现native接口。Native类必须继承于另一个native类。Native类创建一个自动生成的具有必要的 _ glue_ 的C++头文件来和脚本变量及指定函数进行交互。 NativeReplication

意味着对于该类的变量值的复制是在C++实现中处理的。仅对native类有效。 DependsOn(ClassName[,ClassName,...])

意味着ClassName是在这个类之前进行编译。ClassName必须在同一个(或前一个)包中指定一个类。多个依赖的类可以通过使用一个单独的 DependsOn 代码行并且类之间通过逗号分界来指定,或者通过为每个类使用单独的 DependsOn 来指定。 Abstract

声明类为一个\base class(抽象的基类)\。这可以防止用户在UnrealEd的世界中添加

这个类中的actor或者在游戏中创建这个类的实例,因为这个类本身没有任何意义。例如,\物体)\基类是抽象的,然而它的子类\梯子)\不是抽象的—那么你可以在世界中放置一个Ladder,但你不可以在世界中放置一个Actor。这个关键词可以传播到内在的子类,但是不能传播到脚本的子类。 Deprecated

导致该类的所有对象可以被加载但不能被保存。当关卡设计者在编辑器中加载地图时,地图中任何已放置的deprecated actors的实例将会给他们产生一个警告。 Transient

说明‖属于这个类的对象将永远不会被保存到磁盘上‖ 。 仅在和某些类型的netive类结合时才有作用,这些netive类天生不需要持久存在的比如玩家或者窗口。这个关键字可以传播到子类,子类可以使用 NotTransient 关键字覆盖这个标志。 NonTransient

取消从基类继承的 Transient 关键字。 Config(IniName)

意味着允许这个类在.ini文件中存储数据。如果在类(以\或 \声明)中有任何可配置的变量,则可以把这些变量被保存到指定的配置文件中。这个标志可以传播到所有的子类且不能取消传播,但子类可以通过重新声明 Config 关键字 并指定一个不同的IniName来改变.ini文件。正常情况下IniName指定了用于存储数据的.ini文件,但是有几个名称具有特殊的意义:

Config(Engine): 使用引擎配置文件,它的名称是您的游戏的名称后附加上\。比如,ExampleGame的引擎配置文件名称是ExampleEngine.ini。

Config(Editor): 使用编辑器配置文件,它的名称是您的游戏名称后附加\。比如,ExampleGame的编辑器配置文件名称是ExampleEditor.ini。

Config(Game): 使用游戏配置文件,它的名称是您的游戏名称后附加\。比如,ExampleGame的游戏配置文件名称是ExampleGame.ini。

Config(Input): 使用输入配置文件,它的名称是您的游戏名称后附加\。比如ExampleGame的输入配置文件是ExampleInput.ini。 PerObjectConfig

为每个对象存储这个类的配置信息,每个对象在.ini文件中有一个在该对象后以[ObjectName ClassName]的形式命名的部分。这个关键字可以传播到子类。 PerObjectLocalized

以每个对象为基础为这个类定义本地化数据,每个对象在本地化文件中都有一个在该对象后以[ObjectName ClassName]形式命名的部分。这个关键字可以传播到子类。 EditInlineNew

编辑器。意味着这个类的对象可以从UnrealEd的属性窗口中创建(默认行为是仅已存在的对象的引用可以通过属性窗口进行分配)。这标志可以传播到所有子类,子类可以使用 NotEditInlineNew 关键字覆盖这个标志。 NotEditInlineNew 编辑器。取消从基类继承 EditInlineNew 关键字。如果父类没有使用 EditInlineNew 关键字,则该关键字没有影响。 Placeable

编辑器。意味着这个类可以在UnrealEd中创建并可以被放置到关卡、UI scene或者kismet窗口中(依赖于类的类型)。这个标志可以传播到所有子类,子类可以通过使用 NotPlaceable 关键字覆盖这个标志。

NotPlaceable

编辑器。取消从基类继承 Placeable 关键字,意味着这个类不能放置UnrealEd中的关卡中等。

HideDropDown

编辑器。阻止这个类在UnrealEd的属性窗口的复选框中显示。 HideCategories(Category[,Category,...])

编辑器。为这个类的对象指定一个或多个应该在UnrealEd属性窗口中隐藏的类别。为了隐藏声明时的没有类别的变量,可以使用声明变量时所使用的类的名称。 ShowCategories(Category[,Category,...])

编辑器。取消从基类继承 HideCategories 关键字。 AutoExpandCategories(Category[,Category,...])

编辑器。为这个类的对象指定一个或多个应该在UnrealEd属性窗口中自动展开的类别。为了自动展开声明时的没有类别的变量,可以使用声明变量时所使用的类的名称。 Collapsecategories

编辑器。意味着这个类的属性不应该在UnrealEd的属性窗口中以类别分组。这个关键字可以传播到子类,子类可以使用 DontCollapseCategories 关键字来覆盖这个标志。 DontCollapseCategories

编辑器。 取消从基类继承 CollapseCatogories 关键字。 Within ClassName

高级。 意味着这个类的对象在没有ClassName的实例的情况下不能存在。为了创建这个类的对象,你必须指定一个ClassName的实例作为 Outer 对象。这个关键字必须紧跟在类的声明本身后面。 Inherits(ClassName[,ClassName,...]):高级。用于多重继承-指定额外的基类。多个被继承的基类可以通过使用一个 Inherits 并在多个基类之间用逗号分开来指定,或者通过为每个基类分别使用一个=Inherits= 来指定。仅对native类有效。不支持来自两个UObject-derived类的多重继承。

Implements(ClassName[,ClassName,...])

高级。指定一个或多个这个类要实现的接口类。多个接口可以通过使用一个单独的=Implements=且多个接口使用逗号分隔来指定,或者通过为每个接口类使用一个=Implements=来指定。 NoExport

高级。意味着这个类的C++声明不应该被脚本编译器包含到自动生成的C++头文件中。该C++类的声明必须在一个单独的头文件中手动地定义。 变量

变量类型

内置类型

这里是在UnrealScript中的一些实例变量声明的例子:

var int a; //声明了一个整型变量, 名称为\的

var byte Table[64]; //声明了一个64个字节的静态数组,名为\的。


UnrealScript语言参考.doc 将本文的Word文档下载到电脑
搜索更多关于: UnrealScript语言参考 的文档
相关推荐
相关阅读
× 游客快捷下载通道(下载后可以自由复制和排版)

下载本文档需要支付 10

支付方式:

开通VIP包月会员 特价:29元/月

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信:xuecool-com QQ:370150219