首页 > 其他分享 >lua5.1 - function env

lua5.1 - function env

时间:2024-03-03 22:13:48浏览次数:15  
标签:function lua5.1 myEnv private item env MonoTable null void

注意:只在lua 5.1才支持,后面的lua版本做了改动不再兼容

 

myEnv.lua

local myEnv = {}

myEnv.a = 1
myEnv.b = "one"
myEnv.log = print

return myEnv

 

Test.lua

local myEnv= require("myEnv")

setfenv(1, myEnv)
--调用上面的函数后, print将没法使用因为那是在全局env下,
--现在切换为自定义的env了, 只能访问到自定env提供的值
--print("123")
--_G.print("123")

function Test1()
    log(a)
    log(b)
end

Test1()

 

关于setfenv(func or number,tbl)

1) 第1个参数为数字时,1表示修改当前作用域的env,2表示修改上层作用域的,以此类推。特殊情况是0,表示修改当前运行线程的。

2) 第2个参数为新env的table

 

 

一些用法

1) 参考xlua的LuaBehaviour:向C#脚本关联的lua脚本注入c#对象

[System.Serializable]
public class BindObject
{
    public string Name;
    public UnityEngine.Object Obj;
}


public class MyLuaBehaviour : MonoBehaviour
{
    [SerializeField]
    internal BindObject[] m_BindObjects;
    [SerializeField]
    internal string m_ScriptPath;

    private Dictionary<string, UnityEngine.Object> m_BindObjDict;

    private LuaTable m_MonoTable;

    private Action m_LuaOnEnable;
    private Action m_LuaStart;
    private Action m_LuaOnDisable;
    private Action m_LuaOnDestroy;
    private Action m_LuaUpdate;
    private Action m_LuaLateUpdate;

    void Awake()
    {
        OnAwake();
    }

    protected virtual void OnAwake()
    {
        var luaEnv = LuaManager.Instance.LuaEnv;
        if (null == luaEnv) return;

        m_MonoTable = luaEnv.NewTable();

        var mt = luaEnv.NewTable();
        mt.Set("__index", luaEnv.Global); //mt上找不到的, 去global找
        m_MonoTable.SetMetaTable(mt);
        mt.Dispose();

        m_MonoTable.Set("self", this);

        //注入lua Table
        foreach (var item in m_BindObjects)
        {
            if (string.IsNullOrEmpty(item.Name) || null == item.Obj) continue;
            m_MonoTable.Set(item.Name, item.Obj);
        }

        if (string.IsNullOrEmpty(m_ScriptPath)) return;

        var txtAsset = AssetDatabase.LoadAssetAtPath<TextAsset>(m_ScriptPath);
        if (null == txtAsset || string.IsNullOrEmpty(txtAsset.text)) return;

        luaEnv.DoString(txtAsset.text, m_ScriptPath, m_MonoTable); //脚本中不存在的字段, 会先在env对象上找, 没找到再去_Global对象上找

        Action luaAwake = null;
        m_MonoTable.Get("Awake", out luaAwake);
        m_MonoTable.Get("OnEnable", out m_LuaOnEnable);
        m_MonoTable.Get("Start", out m_LuaStart);
        m_MonoTable.Get("OnDisable", out m_LuaOnDisable);
        m_MonoTable.Get("OnDestroy", out m_LuaOnDestroy);
        m_MonoTable.Get("Update", out m_LuaUpdate);
        m_MonoTable.Get("LateUpdate", out m_LuaLateUpdate);

        SafeInvoke(luaAwake);
    }

    void OnEnable()
    {
        SafeInvoke(m_LuaOnEnable);
    }

    void Start()
    {
        SafeInvoke(m_LuaStart);
    }

    void OnDisable()
    {
        SafeInvoke(m_LuaOnDisable);
    }

    void OnDestroy()
    {
        SafeInvoke(m_LuaOnDestroy);
        if (null != m_MonoTable)
            m_MonoTable.Dispose();

        m_MonoTable = null;
        m_LuaOnDestroy = null;
        m_LuaOnDisable = null;
        m_LuaStart = null;
        m_LuaOnEnable = null;
    }

    public void OnUpdate()
    {
        SafeInvoke(m_LuaUpdate);
    }

    public void OnLateUpdate()
    {
        SafeInvoke(m_LuaLateUpdate);
    }

    public UnityEngine.Object GetObject(string name)
    {
        if (null == m_BindObjDict)
        {
            m_BindObjDict = new Dictionary<string, UnityEngine.Object>();
            for (var i = 0; i< m_BindObjects.Length; ++i)
            {
                var item = m_BindObjects[i];
                if (null == item.Obj || string.IsNullOrEmpty(item.Name)) continue;

                m_BindObjDict.Add(item.Name, item.Obj);
            }
        }

        m_BindObjDict.TryGetValue(name, out var obj);
        return obj;
    }

    private void SafeInvoke(Action func)
    {
        if (null == func) return;
        try
        {
            func();
        }
        catch (Exception ex)
        {
            Debug.LogError($"{ex.GetType().Name}: {ex.Message}");
        }
    }

}

 

标签:function,lua5.1,myEnv,private,item,env,MonoTable,null,void
From: https://www.cnblogs.com/sailJs/p/15699892.html

相关文章

  • JavaWeb_mac_env
    maven安装brew安装wgetbrewinstallwgetbrewcleanup--prune=all //删除所有安装缓存下载mavenwgethttps://dlcdn.apache.org/maven/maven-3/3.9.6/binaries/apache-maven-3.9.6-bin.tar.gz或者curl-Ohttps://dlcdn.apache.org/maven/maven-3/3.9.6/binaries/apache......
  • What does -> mean in Python function definitions?
    Whatdoes->meaninPythonfunctiondefinitions?InPython,the"->"symbolisusedtoindicatethereturntypeofafunction.ItispartofthefunctiondefinitioninaPython3.5orlater.Forexample,thefollowingcodedefinesafunct......
  • [Rust] Using ? operator in the main function
    usestd::num::ParseIntError;fnmain()->Result<(),ParseIntError>{letmuttoken=100;letpretend_user_input="8";letcost=total_cost(pretend_user_input)?;//<--use?inmainfunctionifcost>......
  • envoy&istio 对接ratelimit 实现限流之ratelimit简介
    23年的时候公司因调用企业微信接口超限,导致业务问题。架构组经过协商后决定上一个限流服务。限流这块自然而然就落到我负责的网关这块,小公司我一个人负责api网关这块。之前基于istio给公司上线了一个本地的限流(我给公司开发了一个devops管理工具,可以用来管理k8s、istio、jenki......
  • RuntimeError: cuda runtime error (8) : invalid device function at /pytorch/aten/
    今天犯了一个很低级的错误。打开服务器使用python命令训练网络报错:Traceback(mostrecentcalllast):File"Train.py",line166,in<module>result=G(input)File"/home/cat/anaconda3/lib/python3.7/site-packages/torch/nn/modules/module.py",line493,......
  • python-dotenv模块的使用
    安装模块pip3installpython-dotenv使用方式需要在根路径下新建.env文件,并写入配置importosfromdotenvimportload_dotenvfromdotenvimportdotenv_values###方法一res=load_dotenv()#takeenvironmentvariablesfrom.env#返回True或Falseprint(res......
  • [Rust] Specifying a function argument can be mutated
    Followingcodehascompileerror:#[test]fnmain(){letvec0=vec![22,44,66];letmutvec1=fill_vec(vec0);assert_eq!(vec1,vec![22,44,66,88]);}fnfill_vec(vec:Vec<i32>)->Vec<i32>{vec.push(88);vec}......
  • ../inst/include/Eigen/src/Core/MathFunctions.h:487:16: error: no member named 'R
    Asmentionedin conda-forge/r-base-feedstock#163(comment),IsuccessfullyinstalledsctransforminMacsiliconM1Maxbyfirstrun exportPKG_CPPFLAGS="-DHAVE_WORKING_LOG1P intheterminalandtheninstallthepackageinR.......
  • Semantic Kernel 学习笔记:体验基于 prompt function 实现的 Plugin
    在一个SemanticKernelplugin中可以创建两种类型的function,分别是nativefunction与promptfunction(之前叫semanticfunction)。下面这款plugin中给C#method添加了[KernelFunction]attribute,就是nativefunctionpublicclassLightPlugin{publicboolIsOn......
  • [Rust] Implicitly returning values from functions
    Codehaserror:fnmain(){letanswer=square(3);println!("Thesquareof3is{}",answer);}fnsquare(num:i32)->i32{num*num;}Error:⚠️Compilingofexercises/functions/functions5.rsfailed!Pleasetryagain.Here&#......