简单来说,就是把一些经常改动的代码用脚本实现。
/
首先得有这样的需求,希望将经常变动的逻辑(或者说由策划编写的逻辑)在一定的C++框架下可以通过脚本简单快速的拼出来,并且频繁修改,不需要重新编译出包就能快速更新,这里包含了两个需求:
频繁变更的逻辑,不希望频繁重新编译整个游戏
有固定的框架约束,脚本拼装简单到通过工具甚至脚本策划自己就能写完
其次,整个产品组认可这种开发模式,有适合的人做C++框架定接口、做编辑器、写脚本,能接受引入脚本带来的性能略有降低以及调试不便等副作用。
另外,Lua脚本由于其作为配置型脚本的出生,很适合用来作为配置文件或者定义文件(比如各种编辑器生成的数据文件),再往前走一步,连策划数据(通常在Excel中编辑的那些,如果没有专门的逻辑编辑器的话)都可以全部导出成Lua脚本,无论读写都很灵活,同时还保持了纯文本的可检查性。
历史方面:
《大话西游》用的脚本语言是微软的JScript(JavaScript的一种方言),维护不便bug多,受系统IE版本的影响兼容性差。所以2002年网易开发《大话西游II》时,决定在客户端内嵌别的脚本语言。当时该项目技术负责人云风认为要挑不出名的语言,让做外挂的人搞不懂(《大话西游》一代被外挂《月光宝盒》搞死了),于是就选择了Lua 4.0。
云风在九十年代就开发游戏引擎并建设个人网站(云风工作室),在游戏开发领域声望高。网易《大话西游II》是首个在市场上取得成功的国产网络游戏。所以后来国内游戏开发行业纷纷受此影响采用Lua
......
最后我想说,开发游戏并不一定要脚本语言。C/C++这类低级语言写逻辑太不方便,脚本语言能弥补这个缺陷。但如果你的项目主要语言不是C/C++,而是D、Java、Scala、Haskell、Go、C#、F#等性能接近C/C++的高级语言,那么你就不需要额外的脚本语言。王垠写过什么是“脚本语言”,和我的看法基本相同。
当然还有Haxe这种既可以编译成脚本语言,也可以编译成C++的古怪语言来捣蛋。
Language are accepted and evolved by a social process, not a technical or technological one. Successful languages must have modest or minimal computer resource request.
先放一张源码行数对比表:
放心,我不是来说Lua有多么简洁多么美妙,问题不在这里。问题是:为什么Lua这么短?
任何一种程序,它所包含的逻辑功能大致和源码规模是相关的。任何一种实用性的语言都不可能比Lua的源码规模更小,而且未来Lua也不会变大很多,原因是——Lua严格限制了自己要解决的问题,从而把语言特性限制在一个非常有限的范围之内。
//
找不到lua_open
使用lua5.2发现编译器找不到lua_open函数,最后发现这个函数在5.2中已经被遗弃,被新的函数luaL_newstate和lua_newstate替代。lua_newstate可自定义内存分配函数,luaL_newstate使用默认的内存分配方式。
///
- #ifdef lua5.1
- //5.1 下直接使用luaL_register 就好
- luaL_register(L, "libname", funcs);
- #else //lua5.2
- lua_newtable(L);
- //先把一个table压入VS,然后在调用luaL_setfuncs就会把所以的func存到table中
- //注意不像luaL_register这个table是个无名table,可以在的使用只用一个变量来存入这个table。
- //e.g local clib = require "libname". 这样就不会污染全局环境。比luaL_register更好。
- luaL_setfuncs(L, funcs, 0);
- #endif