SLua-在Lua中实现Unity中的生命周期

2019-07-26 14:58:55 浏览数 (1)

Enumerable.Cast(IEnumerable) Method : Casts the elements of an IEnumerable to the specified type. 将一个IEnumerable的元素转换为一个具体的类型。

实现Unity中的Unity生命周期 1.获取Lua的表 2.获取表中的Update方法 3.使用强制类型转换将LuaFunction转换成一个委托方法,此委托方法可以传入LuaTable自身 4.在C#中调用转换成委托的方法并传入LuaTable

代码语言:javascript复制
using System.Collections;
using System.Collections.Generic;
using System.Net.Sockets;
using System.Net;

using UnityEngine;
using SLua;
using System.IO;
using System;

public class OpenLuaFile : MonoBehaviour {

    private LuaSvr lua_svr;
    private LuaTable self;
    private LuaFunction update;

    [CustomLuaClass]
    public delegate void UpdateDelegate(object self);

    UpdateDelegate ud;

    void Start () {
        lua_svr = new LuaSvr();
        lua_svr.init(null, InitComplete,LuaSvrFlag.LSF_EXTLIB);
    }

    private void InitComplete()
    {
        //自定义Lua文件
        LuaState.main.loaderDelegate  = LuaLoader;
        self = (LuaTable)lua_svr.start("HelloLua");
        update = (LuaFunction)self["Update"];
        ud = update.cast<UpdateDelegate>();
    }
    private void Update()
    {
        if (ud != null)
        {
            ud(self);
        }
    }

    [DoNotToLua]
    private byte[] LuaLoader(string fn, ref string absoluteFn)
    {
        string newFn = fn.Replace(".", "/");
        string path = Application.dataPath   "/Scripts/Lua/"   newFn   ".lua";
        byte[] data = null;
        if (File.Exists(path))
        {
            data = File.ReadAllBytes(path);
        }
        else
        {
            TextAsset txt = Resources.Load<TextAsset>(newFn);
        }
        return data;
    }
}

Lua中的表中定义的Update方法

代码语言:javascript复制
function main()
    maxItemCount = 40;

    scrollRect = GameObject.Find("Canvas/Backpack"):GetComponent(UI.ScrollRect);
    
    content = scrollRect.content;
    contentGridLayoutGroup = content:GetComponent(UI.GridLayoutGroup);

    columnCount = math.floor((content.rect.width - contentGridLayoutGroup.spacing.x)/contentGridLayoutGroup.cellSize.x);
    if columnCount ~= 0 then
        rowCount = math.ceil( content.childCount/columnCount );
        curBottomIndex = (rowCount - 1)*columnCount;
        initializedBottomIndex = curBottomIndex;
    end

    oneBlockHeight = contentGridLayoutGroup.cellSize.y   contentGridLayoutGroup.spacing.y;
    local contentSizeDeltaY = math.floor( oneBlockHeight * (math.ceil(maxItemCount / columnCount))) ;
    content.sizeDelta = UnityEngine.Vector2(content.sizeDelta.x,contentSizeDeltaY);

    for i=1,maxItemCount do
        table.insert(itemIDs,i);
    end

    scrollRect.onValueChanged:AddListener(ListenerMethod);
    FreshBackpack();

    return class;
end
function class : Update()
    if UnityEngine.Input.GetKeyDown(KeyCode.Space) then
        JumpToTargetID(12);
    end
    if UnityEngine.Input.GetKeyDown(KeyCode.A) then
        if #itemIDs < maxItemCount then
            table.insert( itemIDs,math.random(0,100) );
            FreshBackpack();
        else
            print("BP Full!");
        end
    end
end

0 人点赞