收藏 分享(赏)

脚本在游戏开发中的应用 --基于Lua的分析.doc

上传人:wo7103235 文档编号:6253048 上传时间:2019-04-03 格式:DOC 页数:38 大小:1.34MB
下载 相关 举报
脚本在游戏开发中的应用 --基于Lua的分析.doc_第1页
第1页 / 共38页
脚本在游戏开发中的应用 --基于Lua的分析.doc_第2页
第2页 / 共38页
脚本在游戏开发中的应用 --基于Lua的分析.doc_第3页
第3页 / 共38页
脚本在游戏开发中的应用 --基于Lua的分析.doc_第4页
第4页 / 共38页
脚本在游戏开发中的应用 --基于Lua的分析.doc_第5页
第5页 / 共38页
点击查看更多>>
资源描述

1、本科毕业论文(科研训练、毕业设计)题 目:脚本在游戏开发中的应用-基于 Lua 的分析姓 名:学 院:软件学院系:软件工程系专 业:软件工程专业年 级: 学 号:指导教师(校内): 职称: 指导教师(校外): 职称: 年 月I脚本在游戏开发中的应用-基于 Lua 的分析【摘要】 在近几年来,进入到游戏中的脚本语言在很大程度上为那些制作游戏的人和玩游戏的人提供了好处。例如程序员可以利用脚本语言来实现引擎特征,或者为游戏构建一个版本 Debug,或者在一台并没有安装开发工具和源代码的计算机上对游戏进行 Debug。脚本语言还可以帮助程序员很快地开发出一些功能,比如 AI 系统的有限状态机,或者任务

2、管理系统等。脚本语言的语句结构比 C+要简单的多,这种简单性允许游戏设计师不用等程序人员花费时间编写 C+功能和重建游戏应用程序就可以自己实现一些游戏玩法特点。现在几乎全世界每一个角落都有玩家在用脚本语言来编写他们最喜欢的游戏的 MOD。今天,脚本语言和游戏引擎一样,已经很普及了。那种要想提供脚本支持只能从头专门建立一个脚本语言系统的时代已经一去不复返了。现在的状况是,开发者可以根据他们在高性能、高兼容性、多线程、网络化,简单化的需要,从多种高产品质量,现成的脚本系统中挑选一种来使用。对于众多的脚本系统,怎样才能选出最适合自己的脚本系统,怎样防止兼容性风险的同时又能最大的发掘系统的特点?本论文

3、从选择脚本开始,到与 C+对象的绑定,以及一些高级的控制,最后结合一个应用实例,提供一些技巧来解决这些问题。关键字:脚本 Lua 对象绑定 高级控制 角色属性IIApplying with script in game developingAnalysing based on Lua【Abstract】 Over the past several years, Scripts in games mostly benefit for people of making games and playing games. For example, programmer could implement

4、the engine character by using Scripts, or build a Debug edition, also do Debugging of the game on a computer which dont install develop tools and has not source codes. Script languages could help programmer to rapidly develop some functionality part too, eg the finitude of states AI system, the task

5、 manage system and so on. Script languages programming structure is more simple than C+s, depending on the simple games designer can implement some special game playing style by themselves without programmer spending several time to edit C+ codes and rebuild the Game.exe. Recently, the players almos

6、t around the world Program their favorite MOD with scripts.Now, the script language is common as the same with the Game Engine. The time that people needing the support of scripts must build the script system from the bottom has gone forever. What is the case now, development team can choose the bes

7、t one from the existing good script languages that fits the needs of the high performance, the good compatible, multi-thread environment, the Netting, and the simple.Facing the many script languages, How to find a Better one for self ? How to avoid either the risk for the problem of compatible or di

8、g the advantages of the system out? This article begins with how to choose a script system, then talks about binding object to c+, and then some high controlling in programming, with an example provides some skills to solve these problems above at last.Key Word:Script Lua Object bindings Control in

9、high level Actor AttributeIII目录第 1 章 简介 -21.1 为什么要使用脚本语言 -21.2 如何选择脚本语言 -21.2.1 语言的编码 -21.2.2 与 C 和 C+的整合 -21.2.3 性能 -21.2.4 对开发的支持特点 -3第 2 章 对 C+对象的绑 定 -42.1 轻量级用户数据 -42.2 轻量级用户数据类型 -42.3 完整用户数据 -52.4 可扩展用户数据 -52.5 表 -62.6 绑定策略衡量标准 -6第 3 章 协同程序实现高级控制 -83.1 协同程序相关概念 -83.2 生成过滤器 -83.3 实现更多功能 -9第 4 章

10、导出角色 属性 -114.1 使用非插入型代理导出角色属性的方案 -114.2 角色、代理和属性 -114.2.1 角色 -114.2.2 角色代理 -114.2.3 角色属性 -124.3 构建角色属性 -134.3.1 函数 -134.3.2 Getter/Setter -134.3.3 属性设计 -144.4 角色 代理 -15第 5 章 UNREAL 脚本实例扩展 -175.1 UNREAL脚本开发 -175.2 建立一个 CAMERAACTOR类 -175.3 集成到 KISMET中 -185.4 演示结果 -19第 6 章 展望下一代游戏脚本 -22IV第 7 章 结论 -23致谢

11、语 -24参考文献 -25VContentChapter1 Introduction -21.1 Why do we choose scripts -21.2 How to choose script language -21.2.1 Code of language -21.2.2 Combine with C/C+-21.2.3 Performence-21.2.4 The support for developing -3Chapter2 Combine with C+ object-42.1 Light user data -42.2 Light user data type-42.3

12、 Full user data -52.4 Extend user data-52.5 Table-62.6 The standard of combining-6Chapter3 Coroutines for high controlling -83.1 The concept of Coroutines-83.2 Build filter-83.3 Implement more -9Chapter4 Export Actor Attribute-114.1 The Solution using non-plug in-114.2 Actor、Actor Proxy And ActorPro

13、perty -114.2.1 Actor-114.2.2 Actor Proxy-114.2.3 ActorProperty -124.3 Build Actor Attribute -134.3.1 Function -134.3.2 Getter/Setter -134.3.3 Attribute Designing-144.4 ActorProxy-15Chapter5 Unreal the extend instance of scripts-175.1 Unreal script coding-175.2 Write a CameraActor class-175.3 Integra

14、tion in Kismet -185.4 Result -19Chapter6 Expect the next new script-22VIChapter7 Summary-23Acknowledgement-24References-25引言1引言当前游戏的资源越来越庞大,参与制作的人员也越来越多,这在很大程度上增加了游戏内容的复杂性。而游戏脚本的出现,则在很大程度上为制作游戏的人和玩游戏的人提供了诸多好处。针对不同的游戏特点,不同的开发团队,什么样的游戏脚本才是适合自己的?本论文将对脚本邦定 C+及其扩展功能实现进行展开,阐明其实现机制,以便团队能针对自己开发人员的特点和引擎的特点,更

15、好地封装自己的脚本,快速构建游戏原型;本文侧重对机制的剖析,开发团队可以针对自己引擎的特点选择合适的实现策略。厦门大学学士学位论文2第 1 章 简介1.1 为什么要使用脚本语言脚本是对于美术师,设计师和玩家来说是一种方便的控制游戏的工具,例如用脚本来控制动画的次序、敌人类 NPC 的行为,以及由 AI 控制的队友对玩家的指示反应,等等。另外,脚本语言使得快速原型开发成为可能,而且这种模式也正在被越来越多的游戏开发团队所接受。1.2 如何选择脚本语言当前比较受开发者欢迎的脚本语言有下面这些:Python,Lua,GameMonkey,AngelScript。它们都有很多共性,因此在如何选择或是改

16、造适合自己的脚本,我认为应该考虑如下四点。1.2.1 语言的编码主要是考虑语言的特征和编码的易用性,如自动内存管理,流控制,迭代特征,类型安全,参数传递等等。1.2.2 与 C 和 C+的整合脚本语言大多是对 C+核心语言的延伸。因此必须要确保在核心引擎和脚本之间的数据转换不需要太多程序方面的努力,并且对于项目的需求来说要功能足够强大,并且足够有效。1.2.3 性能尽管脚本并不用于游戏中与性能相关性很大的部分,但是,在进行游戏及游戏开发的时候如果消耗过多的内存就是一个比较严重的问题了,另外一些任务的执行过缓还会影响到游第一章 简介3戏的帧率。1.2.4 对开发的支持特点一些能使脚本语言使用更为

17、简单和简便的外加工具或功能可以大幅度提高开发人员的效率。比较好的 Debug、说明图和记录工具可以帮助你更为迅速的解决问题。厦门大学学士学位论文4第 2 章 对 C+对象的绑定把一个脚本语言嵌入到游戏中最主要的问题是,如何为脚本语言提供宿主对象的访问。因此嵌入相关问题和绑定相关问题就成为选择或修改脚本的两个关键特性。实现对宿主对象的绑定有许多种策略,每种策略都自己的优点和缺点,游戏开发者必须在得到功能需求后才能确定最合适的策略,下面将针对 5 个对实际绑定有用的策略进行分析。2.1 轻量级用户数据将 C+对象和 Lua 绑定的方法就是把它的内存地址映射成轻量级的用户数据。这种绑定的策略就是用

18、Lua 中一个普通的值对应 C+对象的指针地址,对 C+对象的访问就是通过这个地址值来实现1。把对象映射成简单值至少有 3 个好处:简单、高效和小的内存覆盖。这种策略是非常直截了当的,并且因为没有引入任何的间接访问和内存分配,Lua 和宿主语言之间的通信也是最高的。然而,作为一个实现,这种简单的策略因为用户数据的值始终被当成有效的参数而变得不安全;传入任何一个无效的对象都将会导致宿主程序的直接崩溃。2.2 轻量级用户数据类型加入类型检查机制来避免在 Lua 环境中导致宿主程序的崩溃,当然加入类型检查会降低效率并且增加了内存的使用。如果脚本只是用在游戏的开发阶段,那么类型检查机制可以在发布之前始

19、终关闭。创建一个把每个对象和 Lua 相对应类型名字映射的表,在这张表中,轻量级的用户数据可以作为一个键,而字符串(类型的名称)作为值,该表可以被映射成函数调用。保持该表的独立性是非常重要的,即保证从脚本环境中访问该表是不被允许的;但这仍然可能在脚本中使宿主程序崩溃。保证独立性有几种方法:一种是使用注册表来存储,然而,注册表是惟一且全局的,用它来存储我们的映射对象也阻止了其它的 C 程序库使用它来实现其它的控制机制;另一种更好的方案是只给绑定函数提供访问类型检查表的接口;而在 Lua5.1 中的实现方法是环境表的使用直接和 C 函数相关1。即把类型检查表设置成绑定函数的环境表,这样,在函数里对

20、表的访问就非常高效了。每个函数都需要注册到 Lua 中,从当前的函数中去第二章 对 C+对象的绑定5继承它的环境表,因而只需改变初始函数的环境表关联就足够了。通过这些做法,绑定策略仍然很高效,内存负载也非常低,所有的对象只有一个表实体。2.3 完整用户数据上面的绑定策略虽然高效,但它只是一个值,在 Lua 中你不能把它当成一个对象来对待,所以就更无法使用面向对象的语法来引用它的方法,而且在脚本中无法管理对象的生命周期。要完成对象到对象的映射,我们就得把 C+的对象对应成脚本中一个完整的用户数据。在 Lua 中可以使用自己的 API 来创建一个内存数据块,然后作为一个不透明的对象映射到 Lua

21、中,在 Lua 中是无法区分轻量级用户数据和完整用户数据的;但宿主能关联一张元数据表。元数据表可以定义特定的行为,不同的对象拥有不同的元数据表,当然相同的对象类型拥有一样的元数据表。然后要做的就是注册一个表项,即在一个全局表里把类型名和元数据表映射起来,这样就可以通过类型名找到对应的元数据表,更通俗的说法是可以通过类对象访问它的成员函数。要完成真正的面向对象特性对应,我们还要加上继承和多态。实现面向对象特性实质就是要记录类的体系结构。我们分三步走:首先接收基类的类型名;其次保存基类的元数据表;最后让保存表可以复制传递到下一代。完成后,脚本对象就具有强大的功能了。2.4 可扩展用户数据添加可扩展

22、性,就是能够为对象添加新的属性,重新定义已有的方法,或者扩展对象的行为。为了允许对象添加一个新的字段,我们使用对应的元事件关联,即属性对应属性元事件,方法对应方法元事件。然后把元事件存储到到 Lua 的表中,只有当元事件第一被触发,我们才把修改的环境表赋给用户。这个策略一个明显的缺点就是访问宿主方法的时候会出现性能瓶颈,因为元事件无法直接映射到库表中,所以必须检查字段已经在环境表中,并且所以元事件都通过这个环境表来访问库函数。2.5 表这是个简单而且自然的策略,我们把宿主对象和 Lua 的表直接绑定2,为每一个对象创建一个表,来取代为每个对象创建一个完整的用户数据。很明显这种策略与前面的策略比

23、起厦门大学学士学位论文6来分配了更多的内存。2.6 绑定策略衡量标准绑定策略一般都从灵活性、效率、和内存需求三方面来衡量,下面表 2-1,表 2-2,表2-3 将针对这三方面做一些统计。表 2-1 不同策略提供的特性策略 可访问性 类型检查 面向对象 可扩展性轻量用户数据 轻量用户数据类型 完整用户数据 可扩展用户数据 表 表 2-2 调用代码 100 万次平均耗时时间策略方法调用 属性访问轻量用户数据 0.49s N/A轻量用户数据类型 0.73s N/A完整用户数据 0.94s N/A可扩展用户数据 1.38s 0.59s表 1.49s 0.15s表 2-3 内存消耗比较内存消耗策略每个对

24、象 额外属性轻量用户数据 - N/A轻量用户数据类型 E N/A完整用户数据 U+E N/A可扩展用户数据 U+E T+E/属性表 T+E E/属性表 3 中 U 表示一个完整的用户数据保存在指针中,T 表示一个最初的空白表,E 表示一个表项。第三章 协同程序实现高级控制7第 3 章 协同程序实现高级控制3.1 协同程序相关概念协同程序在游戏编程中是一种非常有效的机制,它对于一个多线程系统中的线程来说会更加的简单,它使用自己的本地执行栈,但是会和其它协同程序共享全局环境;而不像被操作系统管理并在理论上并发执行的标准线程,只有系统程序能够在指定的时间内运行,就像一个标准的函数。但和函数不同,协同程序能够在任意时候挂起并恢复3。因此,协同程序提供一个并发执行的假象而没有任何的消耗和管理同步的负担,这能明显的简化程序结构。Lua 协同程序有 3 种不同的状态:挂起、运行、死亡。并且协同程序从属于它的调用者(比如唤醒它的函数) ,而且控制权总是会被传回给调用者。3.2 生成过滤器输入流 过滤器 输出流图 3-1 简单过滤器事件处理在游戏中是一个简单过滤器的例子:外部事情需要转换成游戏事件,如图 3-1所示。现在存在 3 种情况:(a)一个外部事件映射成一个游戏事件(b)多个外部事件映射成一个游戏事件(c)一个外部事件映射成多个游戏事件在 C+中你需要控制多个函

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

当前位置:首页 > 学术论文 > 毕业论文

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


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

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

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