




已阅读5页,还剩1页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Unity3D游戏开发之Lua与游戏的不解之缘(下)今天我们将视角转换到我们熟悉的Unity平台上来,那么我们为什么要将Lua语言引入Unity平台呢?这是我们今天要思考的第一个问题。传统的单机游戏通常以游戏光盘的形式出售给游戏玩家,玩家在购买游戏后无法获得更多的游戏内容,玩家只能在一张容量有限的游戏光盘里不断地重复寻找着游戏的乐趣。毋庸置疑,这种模式不利于游戏开发方为游戏增加新的内容。可是在互联网技术逐步成熟的今天,玩家在购买一款实体游戏后,通常可以通过购买DLC来体验更加丰富的游戏内容,而游戏制作方则可以通过DLC向玩家传达游戏正传中没有表达出来的内容。我们知道DLC是通常是指游戏的资料片,它是对游戏内容的一种补充。文章出处:狗刨学习网。从技术层面上来讲,如果我们采用编译型的语言来做一款游戏,那么我们根本无法实现对游戏内容的扩充,因为我们需要对整个项目进行重新编译然后打包成游戏光盘再出售给玩家。这样无疑会增加游戏制作方的制作成本,而更重要的是玩家不会为了新的游戏内容而再次购买游戏,显然这种方式是不合理的。那么,此时像Lua这样的脚本语言就可以发挥出巨大的作用,因为脚本语言通常不会占用太多资源,或许我们只需要一个游戏脚本就可以利用游戏中现有的场景和人物开辟出新的游戏剧情。所以,经过一番分析,大家可以总结出脚本语言在游戏开发中一个重要的作用就是更新。因为脚本语言通常都是纯文本文件,我们只需要改变某些参数而不必重新编译整个项目,这正是我们希望看到的。 第一步是下载UniLua,将UniLua引用到项目中有两种方法,一种是将该项目中的UniLua编译成dll然后在Unity项目中使用,一种是将该项目中的UniLua直接复制到Unity 项目中,我们这里使用第二种方法。将UniLua的命名空间添加到我们项目中,我们就可以开始动手写程序了。不过这里,博主想说的是Mono可能会导致的一个错误,.NET4.0以上的版本是支持默认参数的构造函数的。可是由于Mono默认使用的是.NET3.5,所以在编译项目的时候就会报错,我们可以通过Project-Assembly-CSharp-Build-General将.NET的目标框架设为4.0,这样就可以解决这个问题了。好了,下面我们开始写代码啦,首先创建一个InvokeScript.cs的脚本:1. usingUnityEngine;2. usingSystem.Collections;3. usingUniLua;4. 5. publicclassInvokeScript:MonoBehaviour6. 7. /Lua脚本文件,我们将在C#调用该脚本8. publicTextAssetLuaFile;9. /Lua虚拟机10. privateILuaStatemLua;11. 12. voidStart()13. 14. /初始化Lua虚拟机15. mLua=LuaAPI.NewState();16. /加载Lua标准库17. mLua.L_OpenLibs();18. /引用一个静态地C#库19. mLua.L_RequireF(CSharpLib.CLASSNAME,CSharpLib.InitLib,false);20. 21. /执行Lua脚本22. mLua.L_DoString(LuaFile.text);23. 24. 25. voidOnGUI()26. 27. if(GUILayout.Button(调用Lua脚本,GUILayout.Height(30)28. 29. InvokeLua();30. 31. if(GUILayout.Button(调用C#脚本,GUILayout.Height(30)32. 33. InvokeCSharp();34. 35. 36. 37. #region调用C#脚本38. voidInvokeCSharp()39. 40. /获取方法并传入参数41. mLua.GetGlobal(SumAndSub);42. mLua.PushInteger(12);43. mLua.PushInteger(8);44. mLua.PCall(2,4,0);45. 46. #endregion47. 48. #region调用Lua脚本49. voidInvokeLua()50. 51. /获取Lua脚本中的arg1参数52. mLua.GetGlobal(arg1);53. /输出arg154. Debug.Log(Lua脚本中的变量arg1=+mLua.L_ToString(-1);55. 56. /获取Lua脚本中的arg2参数57. mLua.GetGlobal(arg2);58. /输出arg259. Debug.Log(Lua脚本中的变量arg2=+mLua.L_ToString(-1);60. 61. /获取Lua脚本中的Printf方法62. mLua.GetGlobal(Printf);63. /调用Lua脚本中的Printf方法64. mLua.PCall(0,0,0);65. 66. /获取Lua脚本中的Sum方法67. mLua.GetGlobal(Sum);68. /传入参数12和2569. mLua.PushInteger(12);70. mLua.PushInteger(25);71. /调用此方法72. mLua.PCall(2,3,0);73. /获取传入的两个参数及求和结果74. inta=mLua.ToInteger(-3);75. intb=mLua.ToInteger(-2);76. intsum=mLua.ToInteger(-1);77. /输出78. Debug.Log(调用Lua脚本中的Sum方法:+a+b+=+sum);79. 80. #endregion81. 82. 在这段脚本中,我们首先初始化了Lua环境,这一点和我们在C+中使用Lua是一样的,因为UniLua在设计API的时候在命名上和LuaAPI保持了高度的一致,如果你对Lua API足够熟悉的话,那么现在这一切对你而言应该会很简单的。接下来,我们通过Require的形式引入了我们编写的一个C#库,它是一个静态库,目的是封装C#方法以便于Lua脚本来调用,这一部分我们稍后会讲到。接下来,我们通过Unity的AssetText加载了一个Lua脚本文件,该脚本的文件的扩展名是.txt,因为我们只需要Lua脚本的内容。在脚本中我们定义了两个方法InvokeLua和InvokeSharp来分别调用Lua脚本和C#脚本。好了,接下来,我们重点来讲Lua调用C#脚本的这部分,因为UniLua在调用函数这块儿和LuaInterface不太一样,所以我们不能再用原来的先注册C#方法然后再像Lua脚本方法一样,不过博主觉得这里的原理是一样的,不过UniLua提供了更好的方法绑定机制,我们来看下面的脚本:1. usingUnityEngine;2. usingSystem.Collections;3. usingUniLua;4. 5. publicstaticclassCSharpLib6. 7. /当前类文件名称,我们将在Lua脚本中使用这个名称8. publicconststringCLASSNAME=CSharpLib.cs;9. 10. /C#库初始化11. publicstaticintInitLib(ILuaStatelua)12. 13. NameFuncPairdefine=newNameFuncPair14. 15. newNameFuncPair(SumAndSub,SumAndSub),16. ;17. lua.L_NewLib(define);18. 19. return1;20. 21. 22. /我们在C#中定义一个求和差的方法23. publicstaticintSumAndSub(ILuaStatelua)24. 25. /第一个参数26. inta=lua.L_CheckInteger(1);27. /第二个参数28. intb=lua.L_CheckInteger(2);29. /计算和30. intc=a+b;31. /计算差32. intd=a-b;33. 34. /将参数及计算结果压入栈35. lua.PushInteger(a);36. lua.PushInteger(b);37. lua.PushInteger(c);38. lua.PushInteger(d);39. 40. /有四个返回值,尽管在C#中不支持返回多个值,可是在Lua中这样是支持的41. return4;42. 43. 大家一定注意到这里有个NameFuncPair类吧,这就是在UniLua中用来将一个C#方法和Lua方法进行绑定的方法,我们首先构造这样一个NameFuncPair数组,然后将其加入到lua_L_NewLib()的参数中,这样相当于是注册了一个库,我觉得应该就是注册了一个方法集合吧.而CLASSNAME是一个表示当前类名称的常量,可以取任意字符,这里我们使用该类的文件名我们将在Lua脚本是用这个值来查找当前类.接下来,我们可以看到博主构造了一个求和差的C#方法,这个方法和Lua API中定义的方法是一致的,文章出处:狗刨学习网。即我们需要指定该方法会返回的值得数目.如果我们需要返回一个值,就要把它通过push系列的方法压入栈中.这里我们返回了四个值,大家一定会问好是C#还支持返回多个值啊,其实呢,这是Lua语言提供给我们的一个福利啊,比如我们需要返回一个物体在3D世界里的坐标,通常情况下,我们需要用三个赋值语句才能获取吧,可是你用Lua的话,一行代码就可以搞定啦.好,现在我们回到InvokeScript脚本的Start方法中,大家可以注意到这里有一个L_RequireF()的方法,前面只是轻描淡写地说它引入了一个库,那么现在我们看看它具体做了什么吧,第一个参数表示这个类的名字,指向我们定义好的CLASSNAME,第二个参数是这个类的初始化方法指向InitLib()方法,第三个参数是是否要在全局空间中使用这个库,这里我们选在false.好了,这样,我们就完成了C#脚本的编写.好了,下面我们在项目中创建一个纯文本文件,我们输入如下代码:1. localcsharplib=requireCSharpLib.cs2. arg1=Unity3D3. arg2=Unreal4. arg3=Coco2dX5. 6. functionPrintf()7. print(ThisisthemethodsinvokedinLua)8. end9. 10. functionSum(a,b)11. returna,b,a+b12. end13. 14. functionSumAndSub(a,b)15. print(csharplib.SumAndSub(a,b)16. end 第一行代码同样是一个require的方法,这是Lua脚本中引用一个库的方法,该方法可以引用Lua的标准库,同样可以引用我们定义的外部库,大家注意到这里的名字和我们之前定义的CLASSNAME是一样的,因为我们就是通过这个名字来查询这个库的,我们在Lua环境中注册了这个库,所以现在才可以引用这个库.在这段脚本中我们定义了几个字符型的变量,两个Lua方法,一个用Lua包装的C#方法.好了,现在我们将这个文本文件指定到InvokeScript的LuaFile字段,我们通过Lua
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年湖北省荆门市辅警招聘考试题库及答案
- 2025年海南省东方市辅警人员招聘考试题库及答案
- 2025年广西公务员考试公安专业知识模拟试题及答案解析
- 2025年海洋生态保护与修复政策对海洋生态系统稳定性保障作用报告
- 2025年定制式办公家具设计安装与终身维护服务合同
- 2025年旅游纪念品零售店转让及品牌使用合同
- 2025年度绿色草原旅游开发与草场租赁合同样本
- 2025年智慧能源管理平台开发与应用合同
- 组织人事培训课件
- 2025年重型机械安装调试与运输一体化服务合同
- 2025年高一上学期英语开学第一课课件
- 【高中】【政治】2025【秋季】开学第一课:你好高中政治(课件)
- 2024年秋季新人教版八年级上册物理全册教案
- 小学五年级上册生命.生态.安全全册教案
- 顾客财产清单验证确认记录表、产品发放登记表
- 公司企业接收证明
- 国家保安员资格考试培训教材
- 脑脓肿病人护理查房课件
- (烹饪)基本功教学教案
- 快递物流运输公司 国际文件样本 形式发票样本
- 质量三检制培训课件
评论
0/150
提交评论