首页 > 其他分享 >lua协程 - 把回调模式的代码流程改成顺序执行流程

lua协程 - 把回调模式的代码流程改成顺序执行流程

时间:2024-02-29 23:24:08浏览次数:18  
标签:协程 coroutine cb 流程 lua LuaEnv end btn local

像ugui的点击按钮,然后触发相关逻辑,都是回调模式的写法,比如下面代码的ShowAlert调用

public class Test7 : MonoBehaviour
{
    public GameObject m_Alert;
    public Text m_TxtMsg;
    public Button m_BtnYes;
    public Button m_BtnNo;

    private LuaEnv m_LuaEnv;

    void Start()
    {
        m_LuaEnv = new LuaEnv();
        m_LuaEnv.AddLoader((ref string filePath) =>
        {
            filePath = filePath.Replace('.', '/');
            filePath = $"Assets/{filePath}.lua.txt";
            var txtAsset = AssetDatabase.LoadAssetAtPath<TextAsset>(filePath);
            return Encoding.UTF8.GetBytes(txtAsset.text);
        });

        m_LuaEnv.Global.Set("Test7MonoInst", this);
        m_LuaEnv.DoString("require('Lua.Test7')");
    }

    void OnDestroy()
    {
        if (null != m_LuaEnv)
            m_LuaEnv.Dispose();
    }

    //注意: Test7GenConfig不写, lua在调用该函数时无法识别Action<int>
    public void ShowAlert(string msg, Action<int> cb)
    {
        m_Alert.SetActive(true);
        m_TxtMsg.text = msg;

        m_BtnYes.onClick.AddListener(() =>
        {
            if (null != cb) cb(1);

            m_BtnYes.onClick.RemoveAllListeners();
            m_BtnNo.onClick.RemoveAllListeners();
            m_Alert.SetActive(false);
        });

        m_BtnNo.onClick.AddListener(() =>
        {
            if (null != cb) cb(-1);

            m_BtnYes.onClick.RemoveAllListeners();
            m_BtnNo.onClick.RemoveAllListeners();
            m_Alert.SetActive(false);
        });
    }

}

下面的是代码Gen配置(一定要写),同时还要生成下代码才行,否则lua代码没法正确执行

public static class Test7GenConfig
{
    [LuaCallCSharp]
    public static List<Type> LuaCallCsList = new List<Type>()
    {
        typeof(Action), //这个默认的不写, 下面的Action<int>会不生效
        typeof(Action<int>),
    };
}

 

下面的lua代码通过协程将ShowAlert的调用改成顺序执行,而不是通过提供回调函数

function ShowAlert(msg, cb)
    Test7MonoInst:ShowAlert(msg, cb)
end
    
function SyncWrap(func, msg)
    local coThread, isMain = coroutine.running()
    if isMain then error("no in coroutine") return end
    
    local cb = function(btn)
        --点击按钮时, 从暂停位置1继续
        local flag, coReturn = coroutine.resume(coThread, btn)
    end
    func(msg, cb)
    local resumeParam = coroutine.yield() --暂停位置1
    local btn = resumeParam
    return btn
end
    
local coFunc = function()
    local btn = SyncWrap(ShowAlert, "确定要退出吗?")
    if 1 == btn then
        print("点击了Yes")
    elseif -1 == btn then
        print("点击了No")
    end
end

local coThread = coroutine.create(coFunc)
local flag, coReturn = coroutine.resume(coThread)

 

SyncWrap更通用的写法

function SyncWrap(func, ...)
    local coThread, isMain = coroutine.running()
    if isMain then error("no in coroutine") return end

    local cb = function(btn)
        --点击按钮时, 从暂停位置1继续
        local flag, coReturn = coroutine.resume(coThread, btn)
    end
    
    local funcParams = { ... }
    table.insert(funcParams, cb)
    func(unpack(funcParams)
    local resumeParams = { coroutine.yield() } --暂停位置1
    local rets = unpack(resumeParam)
    return rets
end

 

标签:协程,coroutine,cb,流程,lua,LuaEnv,end,btn,local
From: https://www.cnblogs.com/sailJs/p/18041308

相关文章

  • xlua - lua调用c#函数
    c#部分publicclassTest5Obj{publicinti;privatestringstr;publicTest5Obj(){}publicvoidPrintInt(){Debug.Log($"c#PrintInt:{i}");}publicvoidPrintStr(){Debug.Log($"c#Prin......
  • Java流程控制05:Switch选择结构
    Switch多选择结构1.多选择结构还有一个实现方式就是switchcase语句2. switchcase语句判断一个变量与一系列值中某个值是否相等,每个值称为一个分支。3.switch语句中的变量类型可以是:3.1byte、short、int或者char3.2从JavaSE7开始......
  • Java流程控制04:if选择结构
    1.选择结构1.1if单选则结构1.1.1需要判断一个东西是否可行,然后再去执行,这样一个过程在程序中用if语句来表示1.1.2语法:if(布尔表达式){//如果布尔表达式为true将执行的语句}  1.2if......
  • Java流程控制03:顺序结构
    顺序结构:1.java的基本结构就是顺序结构,除非特别指明,否则就按照顺序一句一句执行。2.顺序结构时最简单的算法结构。 3.语句与语句之间,框与框之间是按从上到下的顺序进行的,它是由若干个一次执行的处理步骤组成的,它是任何一个算法都离不开的一种基本算法结构......
  • 流程控制语句
    流程控制语句顺序结构//范例:publicclassTest{publicstaticvoidmain(String[]args){System.out.println("努力做主人喜欢的事");System.out.println("大小姐驾到!通通闪开!");System.out.println("凌冬已至,故乡的梅花开了吗");S......
  • 【JAVA】百度AI接入api使用流程-【黑图像上色】【步骤2】
    前言:根据API文档中java代码,使用idea编辑代码22.1进入网页,找到java代码https://cloud.baidu.com/doc/IMAGEPROCESS/s/Bk3bclns3 2.2新建java项目     2.3创建java类命名为 Colourize(就是刚才在网页里看到的Java代码的类名)  复制java代码  ......
  • 【JAVA】百度AI接入api使用流程-【黑图像上色】【步骤1】
    前言以【黑白图像上色】为例讲解百度AI接口使用,方便新手小白接入,以超级简单的方式操作百度AI库使用步骤1.创建应用获取AK(APIKey),SK(SecretKey)1.1进入: 百度AI官网,在开放能力下面找到:黑白图像上色 1.2选择:立即使用 1.3在创建新应用下,填写相应的信息。注意:接口选择......
  • xlua - lua协程与Unity协程
    lua脚本:Assets/Lua/Test3.lua.txtlocalmove_end={}localLuaEnumeratorImpl={}LuaEnumeratorImpl.__index=LuaEnumeratorImplfunctionLuaEnumeratorImpl.new(coRun)localobj={}setmetatable(obj,LuaEnumeratorImpl)obj:ctor(coRun)retu......
  • xlua - lua中操作c#对象
    1,c#对象映射为lua的userdataa)默认情况,c#对象都是映射为lua的userdata,数据存放在c#层,调用函数也是走c#层。functionLuaUseVector3(v1,v2)v1.x=10print(type(v1),v1.x,v1.y,v1.z)print("v1:",v1,"v2:",v2)print("v1+v2:",v1+v2)v1......
  • 流程控制【代码块与作用域】【选择结构】【循环结构】
    @目录代码块与作用域选择结构循环结构源码:Giteehttps://gitee.com/drip123456/java-seGIthubhttps://github.com/Drip123456/JavaSE专栏:JavaSE笔记专栏代码块与作用域在开始流程控制语句之前,我们先来介绍一下代码块和作用域。不知道各位小伙伴是否在一开始就注意到了,为......