当前位置: 首页 > news >正文

【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 docoroutine.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)
http://www.lryc.cn/news/420372.html

相关文章:

  • CV目标检测概述
  • 如何在notebook中运行nodejs
  • Mybatis学习-day19
  • IDEA构建SpringBoot多模块项目
  • 【前端】NodeJS:nvm
  • Docker网络模式及通信
  • 类模板实现实现Qt click/hover自定义操作
  • Arco Design:引领未来的Vue 3创意先锋,一键开启高效与美感并重的Web开发之旅!
  • 【MySQL】Linux下用C/C++链接MySQL数据库
  • Python金融量化专栏简介
  • 出行365:依托分布式数据库,让出行无忧 | OceanBase案例
  • 【C语言】位段详解
  • LVS集群实验
  • 在 Spring Boot 中使用适配器模式实现支付网关的统一接口
  • 【书生·浦语大模型实战营】第三期 入门岛作业
  • Redis的String类型常用命令总结
  • 河南萌新联赛2024第(四)场:河南理工大学
  • Linux中临时使用账号提权进行业务操作
  • lwip 3. 网线拔掉后 lwip_recvfrom不能返回
  • Linux环境安装Docker Engine
  • 大厂面试题分享
  • FPGA面试问题整理
  • 3Done学习笔记
  • AI学习指南深度学习篇-卷积层详解
  • 2024年TI杯E题-三子棋游戏装置方案分享-jdk123团队-第二弹 手搓机械臂
  • 如何在Java、C、Ruby语言中使用Newscatcher API
  • 集合: Collection的成员方法和相关实现类
  • 过滤器与监听器:深入了解 Java Web 开发中的核心概念
  • 【Linux学习】动静态库从原理到制作
  • WPF篇(10)-Label标签+TextBlock文字块+TextBox文本框+RichTextBox富文本框