在Unity3d中解析Lua脚本的方法

时间:2024-03-21 21:04:38

由于近期项目中提出了热更新的需求,因此本周末在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解决的)

导入后工程的根目录有以下这些东西:

在Unity3d中解析Lua脚本的方法

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

在Unity3d中解析Lua脚本的方法

(注意:此处.txt脚本的后缀名是".txt")

3】将这个存有Lua脚本的.txt文件加载到游戏中,资源类型是"TextAsset":

方法任选,比如:

①放到Resources文件夹中,Resources.Load()来加载;

②放到工程中任意地方,使用Resoueces.LoadAtPath()来加载;

③打成AssetBundle,放到文件服务器上,使用WWW来异步加载。

如果使用③的话,推荐一个名字叫做"HFS"的虚拟文件服务器的小工具很方便,只需点一下,即可模拟一个文件服务器出来:

在Unity3d中解析Lua脚本的方法,非常好用)

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了。你会看到,真的有外部的逻辑在正在运行的游戏中起作用了。