原文:http://blog.sina.com.cn/s/blog_930ffa0b0102vbat.html
IOS不能热更新,不是因为不能用反射,是因为
System.Reflection.Assembly.Load 无法使用
System.Reflection.Emit 无法使用
System.CodeDom.Compiler 无法使用
这三个不能用,就把传统dotnet动态路径坑死了
为啥“这三个不能用,就把传统dotnet动态路径坑死了”呢
动态载入dll或者cs的方法就这几个, IOS 下不能动态载入dll或者cs 文件,已经编译进去的没事。
=========================================================
插件下载地址:
http://ulua.org/
toLua下载地址:
https://github.com/topameng/CsToLua
阿萌对ULUA1.03的BUG修改文章:
http://user.qzone.qq.com/5281069/blog/1408526450?ptlang=2052&ADUIN=522414019&ADSESSION=1425950543&ADTAG=CLIENT.QQ.5396_.0&ADPUBNO=26442
==============写LUA相关的工具==============
BabeLua-vs2012-and-vs2013插件:
设置参考http://www.cocoachina.com/bbs/read.php?tid=205043
使用技巧http://blog.csdn.net/babestudio
LuaStudio,请使用Administrator管理员权限,否则会挂死!!!
==============uLua插件导入到unity3d常见问题==============
导入uLua插件运行自带的例子报错问题:DllNotFoundException: 这个在其老外写的README里已经说了如何解决。
(1)将plugins目录放到最外面,重启unity。
(2)真机没有打包libulua.so进包导致,或者模拟器也有些设置不对。打包的时候把libulua.so打包进libs\armeabi-v7a
EntryPointNotFoundException: 解决方案:
EntryPointNotFoundException:这个类型错误不太单一,可选择下面2中方法解决:(方案1)把除了Assets跟 ProjectSettings目录之外的都删除掉,重新打开工程。(方案2)如果在MAC上,选择IOS平台,很容易出现,切换到MAC/PC平台基本上就解决了,你不能要求在MAC下一定要运行IOS的动态库。
0.16框架报错解决办法:
0.16框架基于u3d4.6,所以在老版本的u3d打开会报错,如果是老版本的话把LuaWrap除了Base目录外所有的Wrap cs文件删掉,然后lua clear菜单调用下就好了。
attempt to index global 'UnityEngine':
uaScriptException: [string "define.lua"]:1: attempt to index global 'UnityEngine' (a nil value)解决:生成wrap文件。
tolua c#简单使用方法:
打开Editor/BindLua.cs文件,在static BindType[] binds = new BindType[]变量末尾一行加入要导入的cs类,比如Resources类,保存等u3d编译完后,选择“Lua/Gen LuaBinding Files”编译即可,以后就可以在lua里面使用此类了,而不要导入进来。映射public成员
C#里面有个编辑器工具类可以用Wrap映射到lua里使用
public static class LuaBinder {
public static void Bind(IntPtr L) {
ObjectWrap.Register(L);
}
}
这个等价于我们之前在lua中写的
luanet.import_type("UnityEngine.Object")
lua脚本里在定义基础类型的时候
Object = luanet.import_type("UnityEngine.Object")
Object = UnityEngine.Object
这两种写法有区别吗,还是随便写哪个都行?
用后者 效率高。前者是反射
_lua_tocbuff 是阿萌自己添加的,用于xml
_luaopen_ffi 是luajit的,
_luaopen_luaXML
删掉函数声明即可
lua的loop库可以正常用在ulua里吗
看库是否用到了c++代码了
自己直接拿lua5.1源码编的ulua.dll
Windows下用可以用vs编吧,我把那个lua_wrap.c也添加了
如果你的错误是找不到入口,就加这个宏,LUA_BUILD_AS_DLL,具体查一下readme。
加上这个_GT(typeof(JsonObject)), 点击GEN LUA WRAPPER后unity直接就崩溃了
记得嵌套2层以上的模板就不行了,如 Dictionary>
如何在LUA中遍历CSharp的数组:
LuaTable mMap;
Dictionary mLuaMap;
public LuaTable Map {
get {
if (mMap == null) {
mLuaMap = new Dictionary( );
mMap = TTLuaMain.Instance.luaState.NewTable( );
for (int i = 0, iMax = mVariables.Length; i < iMax; i++) {
var val = mVariables[i];
mMap[val.name] = val.val;
mLuaMap.Add(val.name, val);
}
}
return mMap;
}
}
LuaVariable 是我自定义的类型,你可以随便传, 这个是指我在C#里写的数组类型
核心思想就是把你C#数组里面的东西,放入table,如果是单纯的数据类型,你可以直接lua里面for 0,maxlength 如果是字典类型的,你就要转换。
比如我这里:
通过TOLUA,把Collider2d类型注册给ULUA,直接lua里面for 0,maxlength 遍历。
再贴上ULUA群主写的范例:
uLua自带的案例
2015年3月26日 15:58:22 补充说明,升级到U3D5.0.0F4,U3D API改了很多,都得用getcomponent函数,以前直接THIS.transform已经不能用了,所以自带的小案例会报错。
02_CreateGameObject:
这里我先写个最平常不过的U3D下的C#脚本
=======================ExtendMonoScript.cs================
public class ExtendMonoScript : MonoBehaviour {
void Start ( ) {
aaa( );
}
public void aaa ( ) {
Debug.Log(this + "普通的函数调用!");
}
public static void StaticMethod ( ) {
Debug.Log("公有静态函数!!");
}
private static void PirvateStaticMethod ( ) {
Debug.Log("私有静态函数!!");
}
public void ObjMethod ( ) {
Debug.Log("公有成员函数!!");
}
private void PrivateObjMethod ( ) {
Debug.Log("私有成员函数!!");
}
}
=======================ExtendMonoScript.cs================
=======================CreateGameObject.cs===============
using UnityEngine;
using System.Collections;
// lua
using LuaInterface;
public class CreateGameObject : MonoBehaviour {
private string script = @"
luanet.load_assembly('UnityEngine')
GameObject = luanet.import_type('UnityEngine.GameObject')
luanet.load_assembly('Assembly-CSharp')
local newGameObj = GameObject('Creat_GameObj_In_Lua')
newGameObj:AddComponent('ExtendMonoScript')
";
void Start () {
LuaState l = new LuaState();
l.DoString(script);
}
}
=======================CreateGameObject.cs===============
load_assembly加载程序集,这样LUA才能使用其API
import_type导入类型,这样LUA才能使用改类型
newGameObj:AddComponent('ExtendMonoScript')这里注意初学LUA,“:”与“.”的区别
DoString(script);真正使用ULUA插件时不要用这个,因为效率低下。
03_AccessingLuaVariables:
========================AccessingLuaVariables.cs==========================
using UnityEngine;
using System.Collections;
using LuaInterface;
public class AccessingLuaVariables : MonoBehaviour {
// 对象调用函数用: load_assembly是载入程序集 import_type是引入类型
// ..相当于是C#里的字符串+,就是连接字符串的意思
// local表示局部变量,没写都为全局变量
// {}表示TABLE,lua里数组,链表等等结构都使用该方式模拟出来
// table.insert表示Append,在数组最后插入一个新元素
private string script = @"
luanet.load_assembly('UnityEngine')
GameObject = luanet.import_type('UnityEngine.GameObject')
g_particles = {}
for i = 1, g_Objs2Spawn, 1 do
local newGameObj = GameObject('NewObj' .. tostring(i))
local ps = newGameObj:AddComponent('ParticleSystem')
ps:Stop()
table.insert(g_particles, ps)
end
g_var2read = 42
g_array = {}
for i = 1, 5, 1 do
table.insert(g_array, i)
end
";
void Start () {
LuaState l = new LuaState();
// 给全局变量赋值
l["g_Objs2Spawn"] = 5;
l.DoString(script);
// 取得全局变量