游戏开发和游戏脚本的那些事

0x00 前言:

自从年底换了公司之后已经有一段时间没有写博客了。可能是这段时间工作的更愉快了,所谓“业精于勤,而荒于嬉”吧(此处有表情)。这周终于意识到了这点,看来还是要恢复之前写博客的状态。今天就来写写游戏引擎和脚本编程的话题吧。

0x01 游戏脚本,用还是不用?

这是一个问题?
游戏开发提供对脚本的支持可谓源远流长。
f2817bcb0a46f21fe838a1c2f6246b600d33aeda.jpg
2002年的无冬之夜,玩家可以方便的开发Mod。

20090713065321-1538168564.jpg
2005年的黑与白2,按照剧本演绎大电影的感觉。

122433gz64zw4xmrshd9xs.jpg
2011年的老滚5,玩家可以方便的开发自己的Mod,生命力直到6年后的现在依然旺盛。

当然,让更多人知道游戏脚本的是网络游戏的兴起。

20100530_b6bc8e047ae9176e4f68QBsCEiZELMds.jpg
24b0b051f8198618df2b57d64aed2e738ad4e6a4.png
开发网络游戏的插件或是外挂,游戏脚本总是要打交道的。

好像大家都在使用脚本开发游戏。

0x02 什么是游戏脚本


使用c/c++开发项目,随着项目的扩大,源码的编译时间也会越来越长。有时修改一些常量就需要重新编译整个项目。是否感觉到了痛苦?

见招拆招,为了解决这个问题,可以将很多常量放到一个初始化文件中。并且编写一段代码去读取并解析这个文件。这样,常量就以初始化文件/配置文件的形式独立出来了。修改常量的值再也不用重新编译整个项目了!

这就是一个最初级的游戏脚本!而且初始化文件中的文本就是最基本的游戏脚本语言。

但是,仅仅是提供一些常量的读取和解析似乎还不能够满足游戏开发的需求,为了提高游戏开发的效率,节约编译c/c++项目时泡咖啡的时间,更高级的游戏脚本语言显然有必要引入。
20121115101523703.jpg
So,更高级的脚本语言增加了脚本和c/c++的交互性,我们不但可以初始化变量,而且可以创建游戏逻辑甚至时游戏对象。

游戏脚本的运行通过虚拟机来进行,我们使用脚本语言的语法编写的函数可以被虚拟机读取并运行。换言之,脚本可以通过虚拟机与c/c++进行通信,使得数据可以在两者之间来回传递。

脚本可以是解释执行的,也可以是编译执行的。解释执行的脚本通过解释器,逐行的读取、解析和执行。但是,为了节约在运行时的开销,一些解释执行的脚本会自动编译脚本。Lua便是其中的代表。

当然,脚本还可以是编译执行的。编译执行的脚本是通过这种脚本语言的编译器编译为某种形式的中间语言(IL)的脚本。虚拟机是可以直接执行这种中间语言的。
这种中间语言是平台无关的,换言之,这种中间语言是供虚拟机使用的,而不关心具体的平台。

例如现在很流行的Unity引擎所使用的C#语言。
C_Sharp_wordmark.png
在使用Unity开发游戏的过程中,脚本代码的编译只需要分为两部分就可以了:
第一部分是从C#代码本身到CIL的编译(其实之后 CIL还会被编译成一种位元码,生成一个 CLI assembly);
第二部分 是运行时从 CIL(其实是 CLI assembly,不过为了直观理解,此处不必纠结这种细节)到本地 指令的即时编译(这就引出了为何 Unity 3D官方没有提供热更新的原因:在 iOS平台中 Mono 无法使用 JIT 引擎,而是以 Full AOT 模式运行的,所以此处说的即时编译不包括 iOS 平台)。

0x03为什么要使用脚本?

便捷的初始化文件:

最简单的应用便是我们可以使用脚本作为初始化文件,这是一个读入/修改游戏数据快速而方便的方法。

1366785737_283556289.jpg

节约游戏开发的时间,提高效率:

随着游戏规模的日益庞大,C/C++代码的编译时间会越来越久。一些需要经常调试的功能如果每次修改都编译一遍整个项目,无疑会造成效率的地下。例如ai程序员,常常需要调试查看效果。因此如果都在C/C++中实现,会造成效率的低下。
153_151217092353_1.jpg

降低了编程的门槛,提高了创造性:

不可否认的一点,一些脚本语言比C/C++更高级,这主要体现在语法更加直观、上手更加容易。因此,一些非程序员也可以使用脚本语言来实现自己的需求。
当然,另一方面来说更容易招到初级程序员。不过,我认为这同时也导致了另外一个问题,即很多程序员因此成为了API搬运工,只知其然而不知其所以然。
276_150719085700_2.jpg

带来了拓展性,Mod:

使用脚本语言,游戏开发商可以把游戏引擎的功能交给玩家。反过来,通过玩家创造的Mod又为游戏提供了新的生命力。
这方面老滚5是一个经典的例子。11年发售的老滚5由于其拓展性,生命力十分顽强。
0d338744ebf81a4ce2694adbd12a6059252da64d.jpg

0x04 游戏开发中脚本的常见使用场景

对话流

2015111914527186.jpg

使用脚本来管理游戏中的对话是一个最常见的应用。这类脚本常常随某个特定的事件而触发。例如场景设计师设计主角在靠近某个NPC时触发和该NPC的对话。对话内容可以直接由场景设计师来制作。

舞台设计

fda29e9e78f74f000930.jpg
脚本在游戏中常见的一个应用还包括设计舞台。通过脚本来控制游戏场景中的对象和各种事件可以营造出很有沉浸式的游戏场景。
这里游戏脚本就十分类似电影的剧本。

玩法逻辑

1559061_092430.jpg
由于逻辑开发需要经常的调试,如果每次代码修改都要进行一次冗长的重新编译,这会造成工作效率和开发人员身体健康的下降。因此使用脚本可以避免这一点。

0x05 后记

在下一篇文章中我们就来聊聊使用Unity游戏引擎开发游戏的过程中和游戏脚本有关的话题吧。
欢迎大家关注我的公众号慕容的游戏编程:chenjd01
201701312351412651fGTISk.png

最后打个广告,欢迎支持我的书《Unity 3D脚本编程》~
686199-20160919193306199-2036072132.jpg

posted @ 2017-02-19 01:35  慕容小匹夫  阅读(4477)  评论(3编辑  收藏  举报