收藏 分享(赏)

UnrealScript简单教程.doc

上传人:j35w19 文档编号:7805971 上传时间:2019-05-26 格式:DOC 页数:75 大小:749.92KB
下载 相关 举报
UnrealScript简单教程.doc_第1页
第1页 / 共75页
UnrealScript简单教程.doc_第2页
第2页 / 共75页
UnrealScript简单教程.doc_第3页
第3页 / 共75页
UnrealScript简单教程.doc_第4页
第4页 / 共75页
UnrealScript简单教程.doc_第5页
第5页 / 共75页
点击查看更多>>
资源描述

1、- 0 -目 录 UnrealScript 语言参考o 介绍-03 快速链接-03 本文档的目的-03 UnrealScript 的设计目标-03 虚幻引擎 3 中 UnrealScript 的新功能-04 代码结构示例-04 Unreal 虚拟机-08 对象层次-08o 类-09o 变量-12 变量类型-12 内置类型-12 集合数据类型-12 Unreal 类型-12 变量修饰符-13 可编辑性-15 数组-15 Structs-15 修饰符-17 枚举-17 常量-18 Object 和 actor 引用变量-18 类引用变量-19o 表达式-20 赋值-20 在类之间转换对象引用-21

2、o 函数-22 声明函数-22 函数参数修饰符-23 函数重载-24 高级函数修饰符-25o 控制结构-27 循环结构-27 循环-27 Do 循环-27 While 循环-28 Continue-28 Break-29 选择结构-29 If-Then-Else 语句-29 Case 语句-30 Goto-31o 语言功能-32 内置的操作符和它们的优先级-32 通用函数-33- 1 - 创建对象-33 整型函数-35 浮点型数据函数-35 字符串函数-36 Vector 函数-37 计时器函数-37 调试函数-37 UnrealScript 处理器-38 UnrealScript 工具和使用

3、-38 Script Profiler(脚本分析器) -38 脚本调试器-38 虚幻开发环境(UDE)-38o 高级的语言功能-38 计时器-38 状态-38 状态概述-38 状态标签和 Latent 函数-40 状态继承和范围规则-41 高级的状态编程-43 状态栈-44 Replication(复制) -45 Iteration(迭代)(ForEach) -45 函数调用限制符-46 在一个变量类中访问静态函数-47 变量的默认值-47 访问变量的默认值-47 通过一个类的引用来访问变量的默认值-48 使用 defaultproperties(默认属性)语句块指定默认值-48 语法-48

4、Struct 默认值-51 动态数组-51 长度变量-53 迭代动态数组-53 接口类-53 函数 Delegates-53 Native 类-53 元数据支持-54 元数据概要-54 使用多个元数据说明-54 提供的元数据说明-54o 高级技术问题-55 UnrealScript 的实现-55 UnrealScript 的二进制兼容问题-55 技术注意事项-55 UnrealScript 编程策略-56附 录 1: UnrealScript 预 处 理 器 (UPP)-58- 2 -附 录 2: UnrealScript 接 口 -61附 录 3: UnrealScript Delegate

5、s(代 理 )-63附 录 4: Unreal Script 结 构 体 应 用 -66 介 绍 快 速 链 接 请一定要查看 UnrealScript 的快速参考表和 掌握 UnrealScriptTOC 指南 。 本 文 档 的 目 的 这是一篇描述 UnrealScript 编程语言的技术文档。它不是指南,也没有提供有用的UnrealScript 代码的详细例子。要获得 UnrealScript 的例子,读者可以参考引擎的源代码,它提供了成千上万行的有效代码,用来解决许多例如 AI、运动、武器装备和触发事件等很多问题。最好的入门方式是查看“Actor“、“Object(物体)“、 “Co

6、ntroller(控制器)“、 “Pawn(士兵)“ “Weapon(武器)“的脚本。 本文档假设读者使用过 C/C+或 Java 编程语言、熟悉面向对象程序设计、已经玩过Unreal 的游戏并使用过 UnrealEd 的编辑环境。 对于是面向对象程序设计的新手的程序员,我强烈推荐您去 A 或者书店买一本介绍 java 编程方面的书。Java 和 UnrealScript 很相似,并且由于它的干净和简单的方法使它成了一种值得学习的极好的语言。 UnrealScript 的 设 计 目 标 UnrealScript 是为开发团队和第三方 Unreal 开发人员创建的,是一种强大的内置的编程语言,

7、它自然地满足了游戏编程的需要和细小差别。 UnrealScript 的主要设计目标: UnrealScript 支持传统的编程语言没有提到的时间、状态、属性、网络等主要的概念。这大大地简化了 UnrealScript 代码。基于 C/C+的 AI 和游戏逻辑编程的主要复杂性是处理要花费一定量的游戏时间来完成的事件以及处理依赖物体状态的各个方面的事件。在 C/C+中,这将会导致冗长的混乱的代码,使代码难于书写、理解、维护和调试的。UnrealScript 包含了对时间、状态和网络复制的内部支持,这大大地简化了游戏编程。 提供一种像 Java 类型编程语言一样简单的、面向对象的并在编译时进行错误检

8、查的语言。就像 Java 为 Web 开发人员提供了一个干净的开发平台,UnrealScript为 3D 游戏提供了一个同样干净的、简单的、强大的编程语言。UnrealScript 从Java 语言中衍生的主要编程观念有: o没有指针并自动进行垃圾回收的环境; o一个简单的单继承类图; o编译时进行强类型检查; o安全的客户端执行的“sandbox“ o像 C/C+/Java 代码一样熟悉的外观和感觉。 UnrealScript 为了在游戏对象和交互方面而不是位和像素方面提供丰富的高层次的编程语言,所以在设计上必须有一些妥协,我们为了获得开发的简单性和强大性,从而牺牲了执行速度。毕竟, Unr

9、eal 的底层的、对性能起重要作用的代码是由 C/C+书写的,在那里所获得的性能提高的价值超出了所增加的复杂性。- 3 -UnrealScript 是在那个层次的基础上进行运作的,在物体和交互性的层次上而不是位和像素的底层上。- 在 UnrealScript 开发的早期,我们探索了几个主要的不同的编程语言范例,然后又放弃了,最终开发出了目前的 UnrealScript。首先,我们研究使用 Sun 和 Microsoft 为 Windows设计的 Java VM(虚拟机) 作为 Unreal 脚本语言的基础。但最终证明在 Unreal 的情境中Java 并没有提供比 C/C+更大的编程好处,反而

10、由于缺乏所需要的语言功能(比如 运算符重载)而增加了一些令人沮丧的限制,另外也证明由于 VM 过多的任务转换开销和 Java 垃圾回收器在处理大的对象图形时的低效率导致运行速度特别的慢。其次,我们设计了基于Visual Basic 变量的 UnrealScript 初期实现,它可以工作的很好,但是对于已经习惯于C/C+的程序员来说,它不是那么友好。最终基于我们想将游戏的特定概念映射到语言定义本身的愿望以及获得速度和熟悉度的需要,我们决定将 UnrealScript 设置为基于C+/Java 变种的语言。结果证明这是一个好主意,因为它在很多方面大大地简化了 Unreal代码。 虚 幻 引 擎 3

11、 中 UnrealScript 的 新 功 能 对于已经熟悉 UnrealScript 的人来说,这里是一个自虚幻引擎 2 后在 UnrealScript 中所发生的主要改变的简短概要。 Replication(复制)-在 UE3 中 replication(复制)语句已经改变: o现在复制(replication)语句块只适用于变量。 o函数复制(replication)现在通过以下方法定义: function specifiers (Server, Client, Reliable ) 状态栈 - 你现在可以使状态压入栈或弹出栈。 UnrealScript 处理器 - 支持宏和条件编译。

12、调试功能 - 添加了新的和调试相关的功能。 默认属性 - defaultproperties 块的处理已经被改变/改进。 o默认值 - structs 现在也可以有默认属性。 o不再允许给配置或者局部变量设定默认值。 o在运行时系统中是随机的,它不再允许执行classMyClass.default.variable = 1 的操作。 动态数组 - 动态数组现在有一个新功能 find() ,用于查找一个元素的索引。 动态数组迭代器 - Foreach 操作符现在可以应用于动态数组。 Delegate 函数参数 - UE3 现在允许 delegates 作为函数的传递参数。 接口 - 添加了对接口

13、的支持 从其它的类中访问常量:classSomeClass.const.SOMECONST 支持多个定时器 默认的函数参数值 - 现在可以指定操作函数参数的默认值。 支持工具提示- 如果在 UnrealScript 中属性声明的上面有一个=/* tooltip text */=形式的注释,则在编辑器的属性窗口中,当您将鼠标放到一个属性上时可以显示工具提示文本。 支持元数据 - 通过将属性和各种类型的元数据相关联,扩展了 in-game(游戏中)和 in-editor(编辑器中)的功能。 代 码 结 构 示 例 这个示例说明了一个典型的简单的 UnrealScript 类,并且它囊括了 Unre

14、alScript 的语法和功能。注意由于该文档没有和代码同步,所以这个代码可能和现在的 Unreal 源代码的呈现不一样。 - 4 -/=/ TriggerLight./ 一个可以通过触发进行开关的光源/=class TriggerLight extends Light;/-/ 变量var() float ChangeTime; /光源从开到关所需要的时间var() bool bInitiallyOn; /它在最初是否是亮的var() bool bDelayFullOn; / 在到完全的点亮之前是否有延迟var ELightType InitialType; / 光源的初始类型var floa

15、t InitialBrightness; /光源的初始亮度var float Alpha, Direction;var actor Trigger;/-/引擎函数/在游戏开始播放时调用function BeginPlay()/ 记忆光源的初始类型并为它设置一个新的类型Disable( Tick );InitialType = LightType;InitialBrightness = LightBrightness;if( bInitiallyOn )Alpha = 1.0;Direction = 1.0;elseLightType = LT_None;Alpha = 0.0;Directio

16、n = -1.0;/ 当时间经过时调用function Tick( float DeltaTime )- 5 -LightType = InitialType;Alpha += Direction * DeltaTime / ChangeTime;if( Alpha 1.0 )Alpha = 1.0;Disable( Tick );if( Trigger != None )Trigger.ResetTrigger();else if( Alpha 0 amp;amp;amp;amp; Alpha!=1) | Alpha=0 )LightBrightness = 0;elseLightBrigh

17、tness = InitialBrightness;/-/公有状态/触发打开光源state() TriggerTurnsOnfunction Trigger( actor Other, pawn EventInstigator )Trigger = None;Direction = 1.0;Enable( Tick );/触发关闭光源state() TriggerTurnsOfffunction Trigger( actor Other, pawn EventInstigator )- 6 -Trigger = None;Direction = -1.0;Enable( Tick );/触发切

18、换光源的开关state() TriggerTogglefunction Trigger( actor Other, pawn EventInstigator )log(“Toggle“);Trigger = Other;Direction *= -1;Enable( Tick );/ 触发控制光源state() TriggerControlfunction Trigger( actor Other, pawn EventInstigator )Trigger = Other;if( bInitiallyOn ) Direction = -1.0;else Direction = 1.0;Ena

19、ble( Tick );function UnTrigger( actor Other, pawn EventInstigator )Trigger = Other;if( bInitiallyOn ) Direction = 1.0;else Direction = -1.0;Enable( Tick );在这个脚本中要看的主要元素是: 类的声明。每个类“extends“ (继承)一个父类,并且每个类属于一个“package(包),“,一组对象一起发布。属于一个类的所有功能和变量,仅属于那个类的actor(物体)可以访问。没有整个系统范围可以使用的全局函数或变量。 More Details

20、更多详情 变量声明。UnrealScript 支持多种变量类型,包括大多数基于 C/Java 的类型、对象引用、structs (结构体)和数组。另外,变量可以被设置成为可以编辑的属性,- 7 -这样设计人员在 UnrealEd 中即使不用任何编码就可以访问这些变量了。这些属性通过使用 var() 语法来指定,而不是 var 。 More Details 更多详情 函数。函数可以有一系列的参数,并且可以随意地返回一个值,也可以有局部变量。某些函数是由虚幻引擎本身调用的(例如 BeginPlay),有些是由其它的脚本代码进行调用的。(比如 Trigger)。 代码。支持所有的标准的 C 和 Ja

21、va 关键字,比如 for=、 =while=、 =break=、 =switch=、 =if 等等。 Actor 和 object(对象)引用。这里你看到了几个在另一个对象中使用对象引用调用一个函数的情况。 关键词“state“。这个脚本定义了几个“states“,它们由函数、变量和仅当这个物体在那个状态时所执行的代码组成。 注意:在 UnrealScript 中,所有的关键词、变量名、函数和对象名都是大小写不敏感的。对于 UnrealScript 来说,=Demon=, demON, 和 demon 是同样的事情。 Unreal 虚 拟 机 Unreal 虚拟机有以下几部分组成:服务器、客

22、户端、渲染引擎及引擎支持代码。 Unreal 控制着所有的玩家和物体间的游戏性和交互。在一个单人游戏中,Unreal 客户端和Unreal 服务器在同一台机器上运行;在一个网络游戏中,有一个机器用于专用服务器;所有连接到这个机器上的玩家是客户端。 所有的游戏播放都发生在一个“关卡“中,它是一个包含着几何体和物体的独立环境。尽管UnrealServer 可以同时运行多个关卡,每个关卡独立运作并且彼此屏蔽:物体(actors)不能在不同关卡间穿行,而且一个关卡中的物体不能和另一个关卡中的物体进行交流。 在地图中的每个物体都可以或者在玩家的控制下(在网络游戏中可以有很多玩家)或者在脚本的控制下。当一

23、个物体在脚本的控制下时,那么该脚本完全地定义了物体如何移动及如何与其它物体进行交互。 对于世界中所有这些物体的跑动、执行脚本、事件发生,你也许会问它们是如何能理解UnrealScript 的执行流程哪。答案如下所示: 为了管理时间,Unreal 将游戏播放的每秒钟分隔为“Ticks“。一个 Tick 是关卡中所有物体更新所使用的最小时间单位。一个 tick 一般是一秒钟的 1/100 到 1/10。Tick 时间仅受到CPU 功率的限制,机器速度越快,tick 持续时间越短。 在 UnrealScript 中的某些命令的执行只需要使用零 tick(也就是:它们的执行没有占有任何游戏时间),也有

24、些命令需要占用很多 ticks。需要占用游戏时间的函数称为“latent functions(潜伏的函数)“。一些 latent functions 函数的例子包括 Sleep , FinishAnim , and MoveTo 。UnrealScript 中的 Latent functions 仅可以从在一个状态的代码中被调用(所以也称作“state code(状态代码)“),而不能从一个函数的代码中(包括在一个状态中定义的函数)被调用。 当一个 actor 在执行一个 latent 函数,那个 actor 的状态执行不会继续直到 latent 函数执行完毕。然而,其它的 actor 或者

25、VM 可能会调用 actor 内部的函数。最终的结果是所有的 UnrealScript 的函数可以在任何时间被调用,甚至在 latent 函数没有执行完毕的情况下。 按照传统的编程术语来说,UnrealScript 就像在关卡中的每个物体有它们自己的执行“thread(线程)“一样工作。在内部,Unreal 不使用 Windows 线程,因为那将是非常低效的(Windows 95 和 Windows NT 不能高效地处理同时发生的成千上万的线程)。然而,UnrealScript 可以模拟线程。虽然这个事实对于 UnrealScript 代码是透明的,但当您书写和 UnrealScript 交互

26、的 C+代码时则变得非常显然的。 - 8 -所有的 UnrealScripts 将彼此独立地执行,如果有 100 个鬼怪正在关卡中走动,那么所有的这 100 个鬼怪的脚本在每个“Tick“中都正在同时地且独立地执行着。 对 象 层 次 在使用 UnrealScript 进行工作之前,理解 Unreal 中物体的高层次的关系是非常重要的。Unreal 的架构和其它大多数的游戏架构是有较大的背离的:Unreal 是完全地面向对象的(非常像 COM/ActiveX),它有一个定义明确的对象模型,可以支持高层次的面向对象的概念比如对象图、序列化、对象生命周期和多态性。从游戏历史上来说,尽管很多游戏比如

27、Doom 和 Quake,已经证明在内容方面有较大的可扩展性,但大多数游戏都被设计成为集成化的,它们的主要功能都是被硬编码的并且是在对象的层次上不能扩展的。Unreal 的面向对象的形式有一个很大的好处:主要的新功能和对象类型可以在运行时添加到 Unreal 中,并且这个扩展是以划分子类的方式进行的,而不是(比如)通过修改一串已有的代码。这种扩展的形式是非常强大的,因为它鼓励 Unreal 团队共同来创建可以所有人都可以操作的改善。 Object 是 Unreal 中所有对象的父类。在 Object 类中的所有函数可以在任何地方访问,因为任何东西都继承于 Object。Object 是一个抽象

28、的基类,它没有做任何有用事情。所有的功能都是由子类提供,比如 Texture (一个贴图),TextBuffer(文字块)和 Class (它描述了其它对象的类)。 Actor(继承 Object)是 Unreal 中所有独立运行的游戏对象的父类。Actor 包含了所有的一个物体所需要的用于四处运动、和其它物体进行交互、影响环境及做其它与游戏相关的有用的事情的功能。 Pawn(继承 Actor)是 Unreal 中所有的可以使用高层次 AI 和玩家控制的创造物和玩家的父类。 Class (继承 Object)是一种描述对象的类的特殊类型的 object。刚看到时可能是令人疑惑的:一个类是一个对

29、象,而其一个类描述某些的对象。但是这概念是合理的,并且在很多情况下您将会用到 Class 的对象。例如,当你在 UnrealScript 产生一个新的 actor,你可能会通过 Class 对象来指定 actor 的类。 使用 UnrealScript,你可以为任何 Object 类书写代码,但是 99%的时候您都是在为从Actor 继承的类来写代码。大多数有用的 UnrealScript 功能是游戏相关的并且是处理actors 的。 类每个脚本明确地对应一个类,并且脚本是通过声明类、类的父类及任何和该类相关的其它附加信息开始的。最简单的形式是: class MyClass extends M

30、yParentClass;这里我声明了一个名为“MyClass“的新类,它继承了“MyParentClass“类的功能。另外,这个类存储在名为“MyPackage“的包中。 每个类继承它父类的所有的变量、函数和状态。然后它可以添加新的变量声明、添加新的函数(或者重写已有函数)、添加新的状态(或者为已有的状态添加功能)。 在 UnrealScript 中典型的设计类的方法是构造一个继承了具有您所需要的大部分功能的现有类(比如 Pawn 类,即所有怪物的基类)的新类(比如一个”人身牛头怪物”)。使用这个方法,你从来不需要重新发明新的东西-你可以简单地增加您想自定义的新功能,然而保持所有你不需要进行

31、自定义的现有的功能。这个方法在 Unreal 中实现 AI 时显得尤其有用,因为在内置的 AI 系统中提供了大量的基础功能,您可以把它们作为您自定义的创造物的组成部分。 类的声明可以带有几个可选的影响类的修饰符: - 9 -Native(包名称)意味着“这个类使用 C+作为幕后支持”。Unreal 期望 native 类在.EXE 文件中包含着一个 C+实现。只有 native 类可以声明 native 函数或者实现 native 接口。Native 类必须继承于另一个 native 类。Native 类创建一个自动生成的具有必要的 _ glue_ 的 C+头文件来和脚本变量及指定函数进行交互。 NativeReplication意味着对于该类的变量值的复制是在 C+实现中处理的。仅对 native 类有效。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报