从零开始搭xlua框架(二)xlua灵活调用C# MonoBehaviour的一些回调函数 (回调函数可热更新)

xlua灵活调用C# MonoBehaviour的一些回调函数 (Update,OnDestroy)

C#端

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using XLua;
public class LuaComponent : MonoBehaviour {

    internal static LuaEnv luaEnv = new LuaEnv(); //all lua behaviour shared one luaenv only!
    internal static float lastGCTime = 0;
    internal const float GCInterval = 1;//1 second 

    private static Action luaStart;
    private static Action luaUpdate;
    private static Action luaOnDestroy;

    private static LuaTable scriptEnv;
    public static void Add(GameObject go, LuaTable tableClass)
    {
        scriptEnv = luaEnv.NewTable();

        // 为每个脚本设置一个独立的环境,可一定程度上防止脚本间全局变量、函数冲突
        LuaTable meta = luaEnv.NewTable();
        meta.Set("__index", luaEnv.Global);
        scriptEnv.SetMetaTable(meta);
        meta.Dispose();

        go.AddComponent();
        scriptEnv = tableClass;

        Action luaAwake = scriptEnv.Get("awake");
        scriptEnv.Get("start", out luaStart);
        scriptEnv.Get("update", out luaUpdate);
        scriptEnv.Get("ondestroy", out luaOnDestroy);

        if (luaAwake != null)
        {
            luaAwake();
        }
    }
   

    // Use this for initialization
    void Start()
    {
        if (luaStart != null)
        {
            luaStart();
        }
    }

    // Update is called once per frame
    void Update()
    {
        if (luaUpdate != null)
        {
            luaUpdate();
        }
        if (Time.time - LuaComponent.lastGCTime > GCInterval)
        {
            luaEnv.Tick();
            LuaComponent.lastGCTime = Time.time;
        }
    }

    void OnDestroy()
    {
        if (luaOnDestroy != null)
        {
            luaOnDestroy();
        }
        luaOnDestroy = null;
        luaUpdate = null;
        luaStart = null;
        scriptEnv.Dispose();
   
    }
}

lua端

LuaComponent={}

function LuaComponent:start()
	print("lua start...")
end

function LuaComponent:update()
		print("lua update...")
end

function LuaComponent:ondestroy()
    print("lua destroy")
end

实例化对象

require "LuaComponent"
local go = CS.UnityEngine.GameObject("123")
CS.LuaComponent.Add(go,LuaComponent)

你可能感兴趣的:(lua)