在Unity3d中解析Lua脚本的方法
由于近期项目中提出了热更新的需求,因此本周末在Lua的陪伴下度过。对Lua与Unity3d的搭配使用,仅仅达到了一个初窥门径的程度,记录一二于此。水平有限,欢迎批评指正。
网络上关于Lua脚本和Unity3d的配合使用的资料不多,例子工程大多相同。大概了解到针对性的插件有uLua、UniLua、KopiLua三种。试用了前两种,抛开效率与安全性不说,感觉uLua试用起来比较简单,本文只介绍uLua的使用步骤。
uLua的原理是在Unity3d中解析字符串形式的Lua脚本,让Lua与C#相互传递参数和方法,这样可以以文本的形式记录Lua脚本,游戏启动后就能够动态地让一部分外部逻辑在游戏中运行起来。
如果在外部的Lua脚本中记录了加载资源的内容,那么就可以通过更新这个记录有Lua脚本的文档来加载不同的资源,实现游戏的热更新。
(当然,Lua脚本的使用的多少,使用在哪些部分,感觉值得为每款游戏量身思考,比如担心效率不高,可能就不适合使用在要求运行速度的部分;一旦Lua脚本中出现了报错,他只会报在C#中解析他的地方,因此查错的难易程度可能也是个问题)
1】下载到ulua的资源包,导入工程中,按照说明,将其中的Plugins文件夹中的内容整体复制到工程的Plugins文件夹中;
(这一步可能会出现找不到dll的错误,我这里是重启Unity解决的)
导入后工程的根目录有以下这些东西:

2】在.txt文件中编写一些Lua脚本,比如:

(注意:此处.txt脚本的后缀名是".txt")
3】将这个存有Lua脚本的.txt文件加载到游戏中,资源类型是"TextAsset":
方法任选,比如:
①放到Resources文件夹中,Resources.Load()来加载;
②放到工程中任意地方,使用Resoueces.LoadAtPath()来加载;
③打成AssetBundle,放到文件服务器上,使用WWW来异步加载。
(如果使用③的话,推荐一个名字叫做"HFS"的虚拟文件服务器的小工具很方便,只需点一下,即可模拟一个文件服务器出来:
,非常好用)
4】解析Lua脚本:
LuaState ls = new LuaState();
ls.DoString(luaString); //luaString是加载进来的文档中的字符,类型是string
LuaFunction lf = ls.GetFunction("luaFunc"); //luaFunc是Lua脚本中编写的方法名
object[] r = lf.Call(""); //括号中的"2"是要传递到Lua中的方法中的参与整型运算的值
return r[].ToString(); //r[0]即是运算后返回的值,类型是object,用之前,需要转一下类型
非常简单,综上,Lua与Unity3d中的C#的联系,互相传递方法和参数,就OK了。你会看到,真的有外部的逻辑在正在运行的游戏中起作用了。
在Unity3d中解析Lua脚本的方法的更多相关文章
- 【COCOS2DX-LUA 脚本开发之一】在Cocos2dX游戏中使用Lua脚本进行游戏开发(基础篇)并介绍脚本在游戏中详细用途!
[COCOS2DX-LUA 脚本开发之一]在Cocos2dX游戏中使用Lua脚本进行游戏开发(基础篇)并介绍脚本在游戏中详细用途! 分类: [Cocos2dx Lua 脚本开发 ] 2012-04-1 ...
- 在html中添加script脚本的方法和注意事项
在html中添加script脚本有两种方法,直接将javascript代码添加到html中与添加外部js文件,这两种方法都比较常用,大家可以根据自己需要自由选择 在html中添加<script& ...
- 在redis中使用lua脚本
在实际工作过程中,可以使用lua脚本来解决一些需要保证原子性的问题,而且lua脚本可以缓存在redis服务器上,势必会增加性能. 不过lua也会有很多限制,在使用的时候要注意. 在Redis中执行Lu ...
- 新姿势!Redis中调用Lua脚本以实现原子性操作
背景:有一服务提供者Leader,有多个消息订阅者Workers.Leader是一个排队程序,维护了一个用户队列,当某个资源空闲下来并被分配至队列中的用户时,Leader会向订阅者推送消息(消息带有唯 ...
- C++中嵌入Lua脚本环境搭建
第一步(环境准备工作): 工具: ●LuaForWindows_v5.1.4-46.exe傻瓜式安装. 作用:此工具可以在windows环境下编译运行Lua脚本程序.安装完成后会有两个图标:Lua和S ...
- shell中引用其他脚本的方法
在Shell中引用其他脚本的方法是source filename.sh 或 . filename.sh 注意: . 和 filename.sh之间必须有空格
- PowerShell因为在此系统中禁止执行脚本解决方法
PowerShell因为在此系统中禁止执行脚本解决方法 在Powershell直接脚本时会出现: 无法加载文件 ******.ps1,因为在此系统中禁止执行脚本.有关详细信息,请参阅 " ...
- redis中使用lua脚本
lua脚本 Lua是一个高效的轻量级脚本语言,用标准C语言编写并以源代码形式开放, 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能 使用脚本的好处 1.减少网络开销,在Lua脚 ...
- Unity3D中C#和JS的方法互相調用
因为Unity3D中一些腳本的方法仅仅能用在JS中.在C#中是無效的,而C#能够與服務器端通訊,JS本身卻不行.所以勢必會遇到這兩種語言腳本中方法的互相調用,下面是演示样例. 兩個文件 test1.j ...
随机推荐
- MySQL与EXCEL sum sumif sumifs 函数结合_品牌汇总_20161101
计算一些数不难,整体来说还是要培养自我的逻辑意识,逻辑清楚,代码自然而然就知道,总体上训练自己的逻辑,一个是从用户角度,一个是从产品角度. 用户角度需要考虑的是用户的活跃度,具体又可以细分为用户的注册 ...
- Python 2.7获取网站源代码的几种方式_20160924
#coding:utf-8 import urllib2,cookielib if __name__ == '__main__': root_url='https://www.baidu.com/' ...
- ACM学习历程—FZU 2140 Forever 0.5(计算几何 && 构造)
Description Given an integer N, your task is to judge whether there exist N points in the plane su ...
- Adobe Flash Player 27 on Fedora 27/26, CentOS/RHEL 7.4/6.9
This is guide, howto install Adobe Flash Player Plugin version 27 (32-bit and 64-bit) with YUM/DNF o ...
- iView之DatePicker的datetimerange校验
使用DatePicker的type是datetimerange时,处理开始--结束的持续时间校验如下.遇到的问题:时间弹出校验提示,但是程序还是会继续往下走,所以调完校验后,再做判断开始时间是否为tr ...
- CF-839B
B. Game of the Rows time limit per test 1 second memory limit per test 256 megabytes input standard ...
- 3、scala数组
一.Array .Array Buffer 1.Array 在Scala中,Array代表的含义与Java中类似,也是长度不可改变的数组. 此外,由于Scala与Java都是运行在JVM中,双方可以互 ...
- iOS内购流程二(添加产品、沙盒账号以及上架流程)
注意:使用了IAP的App必须先配置好协议.税务和银行业务 一.创建一个App应用 1.登录iTunes Store,点击我的App 2.新建一个App(如果App已经创建,直接点击App进入就行了) ...
- Shaderlab blend
http://www.cnblogs.com/daxiaxiaohao/p/4059310.html 1.不透明度 当我们要将两个半透的纹理贴图到一个材质球上的时候就遇到混合的问题,由于前面的知识我们 ...
- AI资源
网易云课堂 http://study.163.com/topics/IBMOfflinePrograms?utm_source=baidu&utm_medium=cpc&utm_cam ...