ToLua框架下C#与Lua代码的互调

TODO:
Ref:
topameng/tolua/wiki/Examples
ToLua框架下C#与Lua代码的互调
state.LuaGetGlobal 对package[loaded]的封装?
tolua笔记
XLua:C#访问Lua中的table的几种方式
抵制使用 module() 定义模块

Unity命令行模式,也能「日志实时输出」

using System.Collections;
using System.Collections.Generic;
#if UNITY_EDITOR
using UnityEditor;
#endif
using UnityEngine;
using UnityEngine.UI;
using LuaInterface;

[ExecuteInEditMode]
[RequireComponent(typeof(Text))]
public class LangText : MonoBehaviour
{
    public string langKey;
    public Text lbl;

    private LuaState state;
    void Awake()
    {
        Debug.Log("LangText.Awake");
        lbl = GetComponent<Text>();
        Refresh();
    }

    public void CustomUpdate()
    {
        // Debug.Log("LangText.CustomUpdate");
        if (lbl != null)
        {
            lbl.text = "abc";
            //TODO:zjq 用lua state找到对应的中文
        }
    }

    void OnEnable()
    {
        Debug.Log("LangText.OnEnable");
        LuaStudy();
        if (!EditorApplication.isPlaying)
        {
            RegisterUpdate();
        }
    }

    void LuaStudy()
    {

        string luaString = @"print('这是一个使用DoString的Lua程序')";
        string luaFile1 = "logic/config/t_game_language_for_prefab";
        string luaFile2 = "logic/config/t_game_language_for_prefab2";

        state = new LuaState();//建立Lua虚拟机
        state.AddSearchPath(LuaConst.GetFullPath(LuaConst.toluaDir));
        state.AddSearchPath(LuaConst.GetFullPath(LuaConst.luaDir));
        state.Start();//启动虚拟机

        //使用string调用Lua
        state.DoString(luaString);

        //使用文件调用Lua
        //手动添加一个lua文件搜索地址
        // string sceneFile = Application.dataPath + "/LuaStudy";
        // state.AddSearchPath(sceneFile);
        state.Require(luaFile1);//do文件
        state.Require(luaFile2);//载入文件

        //获取Lua变量
        Debug.Log("获取文件中变量:" + state["num"]);
        state["num"] = 10;
        Debug.Log("设置文件中变量为:" + state["num"]);
        //调用Lua方法
        LuaFunction luaFunc = state.GetFunction("Count");
        luaFunc.Call();
        Debug.Log("C#调用LuaFunc,函数返回值:" + state["num"]);

        Debug.Log("C#直接调用Count方法。");
        state.Call("Count", false);


        //对方法传入参数
        LuaFunction valueFunc = state.GetFunction("InputValue");
        //state.LuaGetGlobal 对package[loaded]的封装
        valueFunc.BeginPCall();
        valueFunc.Push("loginBeginLoginTips");
        valueFunc.PCall();
        valueFunc.EndPCall();

        valueFunc.Call("loginBeginLoginTips");

        
        Debug.Log("设置文件中变量为:" + state["result"]);
        Debug.Log("设置文件中变量为:" + state["result2"]);

        // //获取LuaTable
        // LuaTable table = state.GetTable("mytable");
        // table.Call("tableFunc");
        // LuaFunction tableFunc = table.GetLuaFunction("tableFunc");
        // Debug.Log("C#调用table中的func");
        // tableFunc.Call();

        // Debug.Log("获取table中的num值:" + table["num"]);

        // //通过下标直接获取
        // for (int i = 0; i < table.Length; i++)
        // {
        //     Debug.Log("获取table的值:" + table[i]);
        // }


        // //转换成LuaDictTable
        // LuaDictTable dicTable = table.ToDictTable();
        // foreach (var item in dicTable)
        // {
        //     Debug.LogFormat("遍历table:{0}--{1}", item.Key, item.Value);
        // }
        // printTbl(table);

        // //获取LuaTable2
        // LuaTable table2 = state.GetTable("mytable2");
        // Debug.Log("获取table2中的a值:" + table2["a"]);

        // //package.loaded["logic.config.t_game_language_for_prefab"]
        // //package.loaded["logic.config.t_game_language_for_prefab2"]
        // LuaTable packageTable2 = state.GetTable("package");
        // Debug.Log("获取packageTable" + packageTable2);
        // printTbl(packageTable2);
        // LuaTable loadedTable2 = (LuaTable)packageTable2["loaded"];
        // Debug.Log("获取loadedTable" + loadedTable2);
        // printTbl(loadedTable2);
        // LuaTable prefab2Table2 = (LuaTable)loadedTable2["logic.config.t_game_language_for_prefab2"];
        // Debug.Log("获取prefab2Table" + prefab2Table2);
        // printTbl(prefab2Table2);
        // Debug.Log("获取table中的a值:" + table["a"]);


        // LuaTable packageTable = state.GetTable("package");
        // Debug.Log("获取packageTable" + packageTable);
        // printTbl(packageTable);
        // LuaTable loadedTable = (LuaTable)packageTable["loaded"];
        // Debug.Log("获取loadedTable" + loadedTable);
        // printTbl(loadedTable);
        // LuaTable prefabTable = (LuaTable)loadedTable["logic.config.t_game_language_for_prefab"];
        // Debug.Log("获取prefabTable" + prefabTable);
        // printTbl(prefabTable);
        // LuaTable _MTable = (LuaTable)prefabTable.ToDictTable()["_M"];
        // Debug.Log("获取_M" + _MTable);
        // printTbl(_MTable);
        // LuaTable _M2Table =(LuaTable)_MTable.ToDictTable()["_M"];
        // Debug.Log("获取_M2" + _M2Table);
        // printTbl(_M2Table);
        // LuaTable loginBeginLoginTipsTbl = (LuaTable)_M2Table.ToDictTable()["loginBeginLoginTips"];
        // Debug.Log("获取loginBeginLoginTipsTbl" + loginBeginLoginTipsTbl);
        // printTbl(loginBeginLoginTipsTbl);
        // string value = (string)loginBeginLoginTipsTbl.ToDictTable()["value"];
        // Debug.Log("获取table中的value值:" + value);

        // state.Dispose();//使用完毕回收虚拟机
        // Debug.LogFormat("当前虚拟机状态:{0}", null == state);//验证虚拟机状态
    }

    void printTbl(LuaTable table)
    {
        //转换成LuaDictTable
        LuaDictTable dicTable = table.ToDictTable();
        foreach (var item in dicTable)
        {
            Debug.LogFormat("printTbl 遍历table:{0}--{1}", item.Key, item.Value);
        }
    }

    void OnDisable()
    {
        Debug.Log("LangText.OnDisable");
        if (!EditorApplication.isPlaying)
        {
            UnResgisterUpdate();
        }
    }


    private void RegisterUpdate()
    {
        EditorApplication.update += CustomUpdate;
    }

    private void UnResgisterUpdate()
    {
        EditorApplication.update -= CustomUpdate;
    }

    public void Refresh()
    {
        if (lbl != null)
        {
            GameLangSetter.Instance.SetLangText(lbl, langKey);
        }
    }

    [InitializeOnLoadMethod]
    static void StartInitializeOnLoadMethod()
    {
        PrefabUtility.prefabInstanceUpdated += RemoveAllTempPrefab2;
    }

    static void RemoveAllTempPrefab2(GameObject go)
    {
        Debug.Log("RemoveAllTempPrefab2");
        var langTexts = go.GetComponentsInChildren<LangText>(true);
        var found = false;
        foreach (var item in langTexts)
        {
            if (item.lbl.text != "testtesttesttest2")
            {
                item.lbl.text = "testtesttesttest2";
                found = true;
            }
        }
        if (found)
        {
            Debug.Log("found");
            Object prefab = PrefabUtility.GetPrefabParent(go);
            PrefabUtility.ReplacePrefab(go, prefab, ReplacePrefabOptions.ConnectToPrefab);
        }
    }
    // #if UNITY_EDITOR
    //     private void Reset()
    //     {
    //         var text = GetComponent<Text>();
    //         if (text.font == null || text.font.name == "Arial")
    //         {
    //             text.raycastTarget = false;
    //             text.supportRichText = false;
    //             text.verticalOverflow = VerticalWrapMode.Overflow;
    //             text.horizontalOverflow = HorizontalWrapMode.Overflow;

    //             text.text = "文本框";
    //             text.font = (Font)AssetDatabase.LoadMainAssetAtPath("Assets/GameAssets/ui/skinlib/txruihei-s-w2.ttf");
    //             text.fontSize = 24;
    //         }
    //     }
    // #endif
}
//lua
for k, v in pairs(package.loaded) do
    -- print(string.format("package.loaded k:%s v:%s", tostring(k), tostring(v)))
    print("package.loaded" .. tostring(k))
    --print("package.loaded" .. tostring(v))
end

num = 0
mytable = {1, 2, 3, 4}
mytable.tableFunc = function()
    print("调用TableFunc")
end

mytable2 = {}
mytable2.a = 123

function Count()
    num = num + 1
    print("计数器+1,当前计数器为" .. num)
    return num
end

function InputValue(param)
    print("[lua中调用:]InputValue方法传入参数:" .. tostring(param))
    result = param
    -- local tbl = require("logic.config.t_game_language_for_prefab")
    print("TCL: tbl", tbl)
    local co = tbl[param]
    local re = rawget(co, "value")
    re = co[2]
    print("result2", re)
    result2 = re
    -- for k, v in pairs(tbl) do
    --     print("package.loadedk" .. tostring(k))
    --     print("package.loadedv" .. tostring(v))
    -- end
    local tblp = package.loaded["logic.config.t_game_language_for_prefab"]
    print("TCL: tbl", tblp)
    -- for k, v in pairs(tblp) do
    --     print("package.loade tblp dk" .. tostring(k))
    --     print("package.loade tblp dv" .. tostring(v))
    -- end
    local co = tblp[param]
    local val = co[2]
    print("TCL: val", val)
end

local abc = {
    a = 123
}

return mytable2
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值