700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > unity热更新json_unity3d热更新插件uLua学习整理

unity热更新json_unity3d热更新插件uLua学习整理

时间:2022-09-20 22:39:05

相关推荐

unity热更新json_unity3d热更新插件uLua学习整理

前言IOS不能热更新,不是因为不能用反射,是因为

System.Reflection.Assembly.Load 无法使用

System.Reflection.Emit 无法使用

piler 无法使用

这三个不能用,就把传统dotnet动态路径坑死了

为啥“这三个不能用,就把传统dotnet动态路径坑死了”呢

动态载入dll或者cs的方法就这几个, IOS 下不能动态载入dll或者cs

文件,已经编译进去的没事。

=========================================================

尽量只把U3D当一个渲染引擎来看待, 不然你会发现热更资源很悲剧, 资源一定要与逻辑分开, 因为U3D用的是类的序列化,

后期改动会导致前面导出的资源不能用。就和开发AS3游戏差不多了。可以这么理解

1.prefab尽量不去绑定脚本,尽量在代码里AddComponent,在实例prefab的GetComponent.接口操作。

2.prefab可以绑定那些不会再改动的脚本。

============================================================

插件下载地址:

/

toLua下载地址:

/topameng/CsToLua

阿萌对ULUA1.03的BUG修改文章:

http://user./5281069/blog/1408526450?ptlang=2052&ADUIN=522414019&ADSESSION=1425950543&ADTAG=CLIENT.QQ.5396_.0&ADPUBNO=26442

蛮牛上找的关于ULUA的文章:

Unity中使用ulua的个人经验总结

/blog-27966-2568.html?_dsign=0c1fb317

==============写LUA相关的工具?==============

BabeLua-vs-and-vs插件:

设置参考/bbs/read.php?tid=205043

使用技巧/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菜单调用下就好了。

attempttoindexglobal'UnityEngine':

uaScriptException: [string "define.lua"]:1: attempt to index

global 'UnityEngine' (a nil value)解决:生成wrap文件。

toluac#简单使用方法:

打开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>

最后发布程序的时候,会包很多错,是由于TOLUA无法识别代码中加了编辑器运行的条件编译判断,所以手动注释掉与这相关的代码不报错就好,就能正常编译打包程序了。

如何在LUA中遍历CSharp的数组:

LuaTablemMap;

DictionarymLuaMap;

publicLuaTableMap{

get{

if(mMap==null){

mLuaMap=newDictionary();

mMap=TTLuaMain.Instance.luaState.NewTable();

for(inti=0,iMax=mVariables.Length;i

varval=mVariables[i];

mMap[val.name]=val.val;

mLuaMap.Add(val.name,val);

}

}

returnmMap;

}

}

LuaVariable是我自定义的类型,你可以随便传,这个是指我在C#里写的数组类型

核心思想就是把你C#数组里面的东西,放入table,如果是单纯的数据类型,你可以直接lua里面for0,maxlength如果是字典类型的,你就要转换。

比如我这里:

通过TOLUA,把Collider2d类型注册给ULUA,直接lua里面for0,maxlength遍历。

再贴上ULUA群主写的范例:

在lua里怎么遍历 C#的object数组:

通过 IEnumerator:

uLua自带的案例

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("私有静态函数!!");

}

publicvoid 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);

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。