[Unity3D]Unity3D游戏开发Lua随着游戏的债券(在)
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
喜欢我的博客请记住我的名字:秦元培,我的博客地址是blog.csdn.net/qinyuanpei。
转载请注明出处,本文作者:秦元培。 本文出处:http://blog.csdn.net/qinyuanpei/article/details/39826323
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
各位朋友,大家好,我是秦元培,欢迎大家关注我的博客。我地博客地址是blog.csdn.net/qinyuanpei。
假设提到游戏开发,大家一定会想到C/C++、DirectX、OpenGL等这些东西。但是众所周知,游戏行业是一个需求变化极快地行业,假设我们採用编译型的语言,那么我们可能非常难跟上这个时代的步伐,由于编译型的语言每经历一次重大地更新,整个项目都须要又一次编译,这样无疑会影响我们的开发效率。
那么,有没有一种更为高效的游戏开发模式呢?也许答案大家已经看到了。如今在游戏界普遍採用的方式是将游戏的底层逻辑交给C/C++这种底层语言,而将游戏的上层逻辑交给脚本语言。
由于底层逻辑更看重效率而上层逻辑更注重灵活、便捷地使用。比如我们熟知的Unreal引擎是採用UnrealScripts,这是一种相似于Java/C语法地语言。Unity3D引擎是採用的C#/javaScript/Boo这三种脚本语言;cocos2d-x採用地是Lua/javaScript这两种脚本语言,未来可能会支持很多其他的语言。大家可能想问一个问题:什么是脚本语言?所谓脚本语言是一种用来控制软件应用程序且仅仅在被调用时进行解释或编译的编程语言,这种语言通常以文本的形式来存储脚本代码。换句话说。脚本语言相似于一种指令,它缩短了传统应用程序的编写-编译-链接-执行(edit-compile-link-run)这个过程,是一种解释执行的程序。
也许人们发明脚本语言的那一刻起,从未想过要将脚本语言和游戏开发联系在一起,只是脚本语言注定会由于游戏开发而开拓出更为广阔的世界。本文将以眼下游戏开发领域较为流行的Lua语言为线索,深度解密游戏开发领域与脚本语言之间千丝万缕的联系。
一、什么是Lua?
Lua是一个小巧的脚本语言。巴西里约热内卢天主教大学里的一个研究小组于1993年开发,其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。Lua由标准C编写而成。差点儿在全部操作系统和平台上都能够编译,执行。一个完整的Lua解释器只是200k,在眼下全部脚本引擎中,Lua的速度是最快的。
这一切都决定了Lua是作为嵌入式脚本的最佳选择。相比Python和Per的内核。Lua的内核小于120KB。而Python的内核大约860KB,Perl的内核大约1.1MB。Lua语言支持面向对象编程和函数式编程,它提供了一个通用类型的表table,能够实现数组、哈希表、集合、对象的功能。
Lua支持协同进程机制。
作为一门可扩展的语言,Lua提供简单而稳定的交互接口,如Lua和C程序可通过一个堆栈交换数据,这使得Lua语言能够高速地和其他语言实现整合。整体来说。Lua语言具备以下长处:(1)语言优美、轻巧 (2)性能优良、速度快 (3)可扩展性强。
正由于Lua语言具备了这种特点,使得它能和游戏开发领域的需求完美地结合起来。由于我们须要这种一门语言,它能够和C/C++进行完美地交互。由于我们须要它对底层进行封装。它须要足够地简单,由于我们须要简单、灵活、高速地编写代码。
那么显然Lua就是我们一直在寻找地这种语言。
二、Lua能够做什么?
虽然博主已经告诉了大家太多的关于Lua语言的优秀特性,相信大家仍然会对Lua语言的能力存在怀疑。大家也许会想,Lua究竟能够做什么呢?在《Lua游戏开发》一书中作者已经告诉了我们答案:
1、编辑游戏的用户界面
2、定义、存储和管理基础游戏数据
3、管理实时游戏事件
4、创建和维护开发人员友好的游戏存储和加载系统
5、编写游戏的人工智能系统
6、创建功能原型,能够之后用高性能语言移植
这时候我们似乎认为Lua语言在某种程度上就是专门为游戏开发而诞生的,由于它将大量的优秀特性全部指向了游戏开发领域。因此Lua语言走进走进游戏开发领域变得顺利成章,那么,让我们接着往下看吧。Lua在游戏开发领域有那些成熟的案例吧。
三、哪些游戏使用了Lua?
1、魔兽世界
假设提到Lua在游戏领域中第一次崭露头角,我们就不能不说《魔兽世界》这款游戏。由于《魔兽世界》在其client中使用了Lua。使得Lua在游戏领域的作用第一次被展示出来。Lua语言因此在游戏开发领域成名。Lua语言的虚拟机非常轻巧,能够非常easy地嵌入到client程序中。假设须要更新client,仅仅须要更新脚本程序就可以。无需又一次编译整个client。
这样地长处使得Lua在游戏开发领域一战成名。能够说是《魔兽世界》为游戏开发领域带来了这样激动人心的伟大语言,作为Lua在游戏领域攻城略地的尝试,《魔兽世界》功不可没。
2、大话西游2
假设说《魔兽世界》开辟Lua在国外游戏领域地战场,那么网易的《大话西游2》无疑是开启了国内游戏制作公司使用Lua的先河。2002年网易开发《大话西游2》时,决定在client内嵌入新的脚本语言。由于当时使用的微软JScript存在较多Bug、维护不便、兼容性差。当时该项目技术负责人云风吸取了《大话西游1》时外挂泛滥的教训,决定选择一个新的语言。这样既能摆脱对JScript的依赖,又能有效地打击外挂制作者,权衡再三。终于选择了Lua 4.0。后来《大话西游2》在市场上取得了成功,国内游戏开发行业纷纷受此影响採用Lua,能够说是网易Lua走进了国内开发人员的视野。只是到今天为止。Lua在国内仍然是一门较为小众的语言。从《大话西游2》引领国内开发人员将视角转向Lua到今天将近10余年地时间。此中缘由。仅仅有大家自己去想个清楚啦。
3、古剑奇谭
《古剑奇谭》系列游戏是由上海烛龙信息科技有限公司研发的大型3DRPG单机游戏。
游戏设定源自于《山海经》,故事则以武侠和仙侠为创作题材,以中国神话时代为背景,讲述了中国古代侠骨柔情的仙侠文化。《古剑奇谭》系列游戏初代作品与二代作品採用的是不同的游戏引擎和不同的战斗模式,虽然如此,我们依旧能从中找到一个共同点。那就是在初代作品和二代作品中都毫无例外的使Lua作为游戏地脚本语言。
比如以下是《古剑奇谭》红叶湖迷宫场景的Lua脚本节选:
require("Necessary")
require("StoryUtility")
require("BigMap")
require("Script_DLC4")
--------------以下为初始化函数-------------
function OnEnterLevel()
if GetStoryVersion() == 2 then
OnDLCEnterLevelM01()
else
if GetMainStory() == 10100 then
callTaskFunction("story10100")
elseif GetMainStory() == 161900 then
callTaskFunction("story161900")
end
if gValue.MK == 1 then
showNPC("NPC 06", false)
showNPC("NPC 07", false)
enableTrigger("Tri_MK",false)
elseif gValue.MK >1 then
showNPC("NPC 04", false)
showNPC("NPC 05", false)
showNPC("NPC 06", false)
showNPC("NPC 07", false)
enableTrigger("Tri_MK",false)
enableTrigger("Tri_MK 02",false)
end
4、仙剑奇侠传
既然提到了古剑奇谭,怎么能不提仙剑奇侠传呢?虽然和古剑奇谭初代作品公布时间仅仅相差一年的《仙剑奇侠传五》市场反响并没有像游戏制作方所预料地那样成功,只是这部作品值得称赞地地方还是蛮多的,由于进步总是要比缺点多的嘛,毕竟时代在进步。我们不能总是拿仙剑初代作品的高度去要求兴许作品。由于我们已经不再是那个年龄的人。而仙剑依旧要不断地突破自身、大胆创新和进取。好了,我们临时先感慨到这里,仙剑四、仙剑五以及仙剑五前传都使用了RenderWare引擎。可能唯一的不同就是仙剑五和仙剑五前传都使用了Lua吧,以下相同是一段从游戏中提取的脚本:
function baoxiang(id,npcID) player.Control(0)
pid=player.GetMainPlayer()
player.SetAnim(pid,203)
global.Print(id)
global.Wait(1)
y=flag.GetValue(15093) ---------江洋大盗称号获得-------------
jyd=flag.GetValue(15255)
jyd=jyd+1
flag.SetValue(15255,jyd)
global.Print(jyd)
global.AddTimer(0.5,13279)
----------------------------------------- if id~=17711 then
npc.SetAnim(npcID,501)
global.Wait(1)
end
5、金庸群侠传Lua复刻版
四、带你走进Lua的世界
--while-do演示样例代码
myValue=10
while(myValue <= 20) do
print(myValue)
myValue=myValue+1
end
--sample table && for-do演示样例代码
myTables={"Item0","Item1","Item2","Item3"}
for i=1,table.maxn(myTables) do
print(myTables[i])
end
--complex table演示样例代码
myTables={}
myTables["A"]="ItemA"
myTables["B"]="ItemA"
myTables["C"]="ItemA"
myTables["D"]="ItemA"
print(myTables["A"])--"ItemA"
--function演示样例代码
function fib(n)
if(n<2) then
return n
else
return fib(n-1)+fib(n-2)
end
end
--math演示样例代码
maxValue=math.max(12,23,56,18,10)--56
minValue=math.min(25,34,12,75,8)--8
print(maxValue-minValue)--48
--字符串演示
myString="Hello this is the cool program language called Lua";
print(string.find(myString,"Lua"))--48,50
--io演示
io.write("Hello I get a powerful program language called Lua \n")
io.write(string.format("This Lua is %s and now is %s \n",_VERSION,os.date()))
执行结果是:
每日箴言:趁年轻。走自己想走的路。没理由,不去闯。
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcWlueXVhbnBlaQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" />
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
喜欢我的博客请记住我的名字:秦元培,我的博客地址是blog.csdn.net/qinyuanpei。
转载请注明出处,本文作者:秦元培, 本文出处:http://blog.csdn.net/qinyuanpei/article/details/39826323
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
版权声明:本文博主原创文章,博客,未经同意不得转载。转载请注明作者和出处,谢谢!
[Unity3D]Unity3D游戏开发Lua随着游戏的债券(在)的更多相关文章
- [Unity3D]Unity3D游戏开发Lua随着游戏的债券(于)
---------------------------------------------------------------------------------------------------- ...
- Unity 4.2.0 官方最新破解版(Unity3D 最新破解版,3D游戏开发工具和游戏引擎套件)
Unity是一款跨平台的游戏开发工具,从一开始就被设计成易于使用的产品.作为一个完全集成的专业级应用,Unity还包含了价值数百万美元的功能强大的游戏引擎.Unity作为一个游戏开发工具,它的设计主旨 ...
- 【读书笔记《Android游戏编程之从零开始》】19.游戏开发基础(游戏音乐与音效)
在一款游戏中,除了华丽的界面 UI 直接吸引玩家外,另外重要的就是游戏的背景音乐与音效:合适的背景音乐以及精彩的音效搭配会令整个游戏上升一个档次. 在 Android 中.常用于播放游戏背景音乐的类是 ...
- Unity 2D游戏开发教程之游戏精灵的开火状态
Unity 2D游戏开发教程之游戏精灵的开火状态 精灵的开火状态 “开火”就是发射子弹的意思,在战争类型的电影或者电视剧中,主角们就爱这么说!本节打算为精灵添加发射子弹的能力.因为本游戏在后面会引入敌 ...
- Unity 2D游戏开发教程之游戏中精灵的跳跃状态
Unity 2D游戏开发教程之游戏中精灵的跳跃状态 精灵的跳跃状态 为了让游戏中的精灵有更大的活动范围,上一节为游戏场景添加了多个地面,于是精灵可以从高的地面移动到低的地面处,如图2-14所示.但是却 ...
- Unity3D游戏开发——编程实现游戏管理器
本篇简介 本篇介绍了如何将上一篇的设计模式思想运用到实际的开发过程中. 脚本文件 (1)IGameManager:这个接口存在声明了一个属性(一个拥有getter函数的变量,属性的类型是Manager ...
- [Unity游戏开发]向量在游戏开发中的应用(三)
本文已同步发表在CSDN:http://blog.csdn.net/wenxin2011/article/details/51088236 在上一篇博客中讲了利用向量点乘在游戏开发中应用的几种情景.本 ...
- [Unity游戏开发]向量在游戏开发中的应用(一)
本文已同步发表在CSDN:http://blog.csdn.net/wenxin2011/article/details/50810102 向量在游戏开发中是非常实用的,我们在学校学完向量的知识后,只 ...
- [Unity游戏开发]向量在游戏开发中的应用(二)
本文已同步发表在CSDN:http://blog.csdn.net/wenxin2011/article/details/50972976 在上一篇博客中讲了利用向量方向的性质来解决问题.这篇博客将继 ...
随机推荐
- 使用ClassyShark压缩你的项目
原文链接 : Shrinking Your Build With No Rules and do it with Class(yShark) 原文作者 : Roberto Orgiu 译文出自 : 开 ...
- [TypeScript] Sharing Class Behavior with Inheritance in TypeScript
Typescript classes make inheritance much easier to write and understand. In this lesson we look into ...
- [Maven实战](6)仓库(本地仓库,远程仓库,镜像)
1. 简单介绍 maven能够在某个位置统一存储全部maven项目共享的构件,这个统一的位置就是仓库.实际的Maven项目将不会各自存储其依赖文件,它们仅仅须要声明这些依赖的坐标,在须要的时候(比如. ...
- 公钥,私钥和数字签名这样最好理解 分类: B3_LINUX 2015-05-06 16:25 59人阅读 评论(0) 收藏
一.公钥加密 假设一下,我找了两个数字,一个是1,一个是2.我喜欢2这个数字,就保留起来,不告诉你们(私钥),然后我告诉大家,1是我的公钥. 我有一个文件,不能让别人看,我就用1加密了.别人找到了这个 ...
- 14、USB摄像头(V4L2接口)的图片采集
参考网站http://www.cnblogs.com/surpassal/archive/2012/12/19/zed_webcam_lab1.html 一.一些知识 1.V4L和V4L2. V4L是 ...
- GAN(Generative Adversarial Networks) 初步
1. Generator vs. Discriminator 首先需要指出的是生成式模型(generative models)和判别式模型(discriminative models)的区别: dis ...
- python 升级pip
废话少说,直接上图,希望谅解我的懒惰!:)
- [内核编程] 4.1 技术原理 & 4.2 键盘过滤框架
4.1 技术原理 & 4.2 键盘过滤框架 4.1 预备知识 符号链接:符号链接其实就是一个“别名”.可以用一个不同的名字来代表一个设备对象(实际上),符号链接可以指向任何有名字的对象. Zw ...
- redisson
http://www.tuicool.com/articles/BjyeaeQ http://blog.csdn.net/csujiangyu/article/details/51005342
- Shuttle ESB(三)——架构模型介绍(2)
上一篇文章中,介绍了Shuttle ESB架构模型中的三个重要部分. 今天,我们继续介绍剩余的三个内容:模式和消息路由. 四.模式 Request/Response(请求/响应模式) 对基于Reque ...