U3D和ULUA热更新

热更新 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 funcparams object[] args)
        {
            if (!initialize)
                return null;
            int index = LuaFile.LastIndexOf ('/');
                
            string luaClass = LuaFile.Substring (index + 1);
                
            return API.CallMethod (funcluaClassargs);
        }

    }



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# 层都可以获得对方的实例引用

    

    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值