• 【Unity/XLua】xlua自带教程示例分析(6)—— lua协程


    工具准备

    首先是工具脚本,一个Coroutine_Runner.cs和一个cs_coroutine.lua

    前者定义了一个继承自Monobehavior的脚本组件,后者则使用lua去在Unity实例化一个挂载该组件的GameObject,并将其设置为DontDestroyOnLoad,将其开启和停止协程的方法封装成一个表返回

    Coroutine_Runner.cs

    namespace XLuaTest
    {
        public class Coroutine_Runner : MonoBehaviour
        {
        }
    
    
        public static class CoroutineConfig
        {
            [LuaCallCSharp]
            public static List<Type> LuaCallCSharp
            {
                get
                {
                    return new List<Type>()
                    {
                        typeof(WaitForSeconds),
                        typeof(WWW)
                    };
                }
            }
        }
    }
    

    cs_coroutine.lua

    local util = require 'xlua.util'
    
    local gameobject = CS.UnityEngine.GameObject('Coroutine_Runner')
    CS.UnityEngine.Object.DontDestroyOnLoad(gameobject)
    local cs_coroutine_runner = gameobject:AddComponent(typeof(CS.XLuaTest.Coroutine_Runner))
    
    return {
        start = function(...)
    	    return cs_coroutine_runner:StartCoroutine(util.cs_generator(...))
    	end;
    
    	stop = function(coroutine)
    	    cs_coroutine_runner:StopCoroutine(coroutine)
    	end
    }
    

    协程测试

    测试流程:

    通过C#脚本CourontineTest创建lua环境并require ‘corontine_test’,在教程中这会找到与C#脚本在同一层级的Resources文件夹,并索引到该文件夹下的coruntine_test.lua文件

    接着在lua文件中去请求工具文件cs_coroutine,让其创建一个辅助lua协程的对象,并接收一个封装了该对象的创建和停止协程的方法的表

    接着通过向start函数中传入lambda函数来创建协程,使用本地变量保存这些协程,传入stop函数中可以终止这些协程

    使用lua的coroutine.yield函数可以实现unity的协程yield

    具体lua流程:

    • 创建协程a :打印’coroutine a started’,阻塞等待协程内新创建的b
    • 跳转协程b :打印’coroutine b stated inside cotoutine a’,等待1秒,打印’i am coroutine b’
    • 返回协程a :返回协程a,打印’coroutine b finish’。之后无限循环,每1秒打印一次’i am coroutine a’
    • 创建协程a同时创建的协程c :打印’stop coroutine a after 5 seconds’,等待5秒后,终止协程a,打印’coroutine a stoped’,协程c结束
    local cs_coroutine = (require 'cs_coroutine')
    
    local a = cs_coroutine.start(function()
        print('coroutine a started')
    
    	coroutine.yield(cs_coroutine.start(function() 
    		print('coroutine b stated inside cotoutine a')
    		coroutine.yield(CS.UnityEngine.WaitForSeconds(1))
    		print('i am coroutine b')
    	end))
    	print('coroutine b finish')
    
    	while true do
    		coroutine.yield(CS.UnityEngine.WaitForSeconds(1))
    		print('i am coroutine a')
    	end
    end)
    
    cs_coroutine.start(function()
        print('stop coroutine a after 5 seconds')
    	coroutine.yield(CS.UnityEngine.WaitForSeconds(5))
    	cs_coroutine.stop(a)
        print('coroutine a stoped')
    end)
    
  • 相关阅读:
    高性能网络编程 - 关于单台服务器并发TCP连接数理论值的讨论
    【源码+文档+调试讲解】微信小程序家政项目小程序
    springboot整合Mongodb
    RK3568平台(显示篇)DRM HDMI驱动程序
    LeetCode二叉树系列——101.对称二叉树
    Autodesk_Revit2022安装图文教程_Revit2022建筑信息模型BIM软件图文教程
    小程序封装组件简单案例,所有小程序适用(传入参数、外抛事件、传入样式)
    LC118原厂直流驱动芯片 SOP-8
    以太坊代币标准ERC20、ERC165、ERC721
    显示器显示的画面突然偏红色如何解决
  • 原文地址:https://blog.csdn.net/Siro_sama/article/details/141000293