热更新 u3d 和 ulua 绑定
拿做功能界面来说,美术给了一个背包界面BagUI Prefab, 我们通常的做法是 写C#脚本来做对应的逻辑
现在要做热更新,脚本用 lua 来做,我们也希望有一个脚本文件来做这逻辑的封装,同时要做到同时打开
多个该界面,界面之间的是单独独立的实例,就像是C# new 的效果一样,如果只是向ULua 例子那样加个
LuaBehaviour 找到与该prefab 命名一样的脚本表来调用表里的方法,是做不到实例唯一的,那个表是全局的
所以我用了这样的方式解决这个问题
C#层面 :
LuaBehaviour
public class LuaBehaviour : MonoBehaviour
{
[SerializeField]
private string LuaFile;
public LuaTable luatable;
void Awake ()
{
if(LuaFile != null)
{
API.luaMgr.DoFile(LuaFile);
}
luatable = (LuaTable)CallMethod ("Create", gameObject) [0];
luatable.RawGetFunc ("Awake").Call (luatable);
}
void Start ()
{
Debug.LogError (">>>+++++ Start");
luatable.RawGetFunc ("Start").Call (luatable);
}
void OnTriggerEnter2D(Collider2D other) {
luatable.RawGetFunc ("OnTriggerEnter2D").Call (luatable);
}
void OnCollisionEnter2D(Collision2D coll)
{
luatable.RawGetFunc ("OnCollisionEnter2D").Call (luatable);
}
//-----------------------------------------------------------------
protected void OnDestroy ()
{
luatable.dispose()
Util.ClearMemory ();
Debug.Log ("~" + name + " was destroy!");
}
protected object[] CallMethod (string func, params object[] args)
{
if (!initialize)
return null;
int index = LuaFile.LastIndexOf ('/');
string luaClass = LuaFile.Substring (index + 1);
return API.CallMethod (func, luaClass, args);
}
}
LUA 脚本层:
BagUIView = class("BagUIView");
BagUIView.lastTime = 0
BagUIView.gameObject = nil
function BagUIView.Create(o)
-- body
return BagUIView.New(o)
end
function BagUIView:ctor(o )
-- body
SimpleFramework.Util.LogError("=========== ctor ");
self.gameObject = o
self.transform = self.gameObject.transform;
self.lastTime = os.clock()
end
--启动事件--
function BagUIView:Awake()
SimpleFramework.Util.LogError("=========== Awake ");
self:InitPanel();
end
function BagUIView:Start()
-- body
SimpleFramework.Util.LogError("=========== Start ");
end
function BagUIView:OnTriggerEnter2D( ... )
-- body
SimpleFramework.Util.LogError("=========== OnTriggerEnter2D ");
end
function BagUIView:OnCollisionEnter2D( ... )
-- body
SimpleFramework.Util.LogError("=========== OnCollisionEnter2D ");
end
function BagUIView:Update( ... )
-- body
GUIViewManager:OpenUI("BagUI")
if os.clock() - self.lastTime >1 then
GUIViewManager:OpenUI("BagUI")
self.lastTime = os.clock()
self.label.text = os.clock()
end
end
function BagUIView:FixedUpdate( ... )
-- body
if os.clock() - self.lastTime >1 then
GUIViewManager:OpenUI("BagUI")
self.lastTime = os.clock()
self.label.text = os.clock()
end
end
local jj = os.clock()
--初始化面板--
function BagUIView:InitPanel()
self.btnOpen = self.transform:FindChild("Btn/Sprite").gameObject;
self.label = self.transform:FindChild("Label").gameObject:GetComponent('UILabel');
self.label.text = "BagUIID"..os.clock()
self.luaBehaviour2 = self.transform:GetComponent('LuaBehaviour2');
local lltime = self.luaBehaviour2.luatable.lastTime
SimpleFramework.Util.LogError("=========== >>lltime: "..lltime);
function doClick(go)
jj = jj.."_"..math.random(1,12222)
SimpleFramework.Util.LogError("=========== jj "..jj);
self.label.text = "clicked"..jj
-- GUIViewManager:OpenUI("ChatUI",function( obj )
-- body
-- end)
GUIViewManager:OpenUI("BagUI")
end
self.luaBehaviour2:AddEventClick(self.btnOpen,doClick)
end
--单击事件--
function BagUIView:OnDestroy()
warn("OnDestroy---->>>");
end
Prefab界面:
界面绑定C#脚本 LuaBehaviour
LuaBehaviour.LuaFile = "View/BagUIView" // 脚本相对路径
这样当 加载界面并初始化时候 C#层调用lua脚本开始初始化
GameObject go = (GameObject)GameObject.Instantiate (UIObect);
当C# LuaBehaviour 的 Awake() 被U3D 自动调用的时候 就开始加载Lua 逻辑文件了
void Awake ()
{
if(LuaFile != null)
{
API.luaMgr.DoFile(LuaFile);
}
luatable = (LuaTable)CallMethod ("Create", gameObject) [0]; // 对应lua 文件的创建实例全局函数 ,会返回当前lua 类的 实例对象
luatable.RawGetFunc ("Awake").Call (luatable);
}
这样启动后,lua层 和C# 层都可以获得对方的实例引用