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

【Unity/XLua】xlua自带教程示例分析(7)—— 同步测试

文章目录

    • 工具脚本
    • 测试逻辑

该教程与6的文件结构相似,主要知识点是lua工具库Xlua.Util的async_to_sync 方法

这个方法直白的说可以将异步函数转换成一个同步函数,具体表现就是将在异步函数中向回调函数传入的值,直接改造成同步函数的返回值,使用一个新的lua变量接收async_to_sync (异步函数)的返回值即是构造好的同步函数

之后则像同步函数一样在lua中调用这些函数并书写逻辑代码

工具脚本

首先是和6一样有一个MessageBox.cs和message_box.lua作为工具脚本

MessageBox内部有两个异步的静态函数,允许输入回调函数,在函数内部根据情况调用,其中第二个异步函数具有一个bool的参数值

namespace XLuaTest
{public class MessageBox : MonoBehaviour{public static void ShowAlertBox(string message, string title, Action onFinished = null){//logic...}public static void ShowConfirmBox(string message, string title, Action<bool> onFinished = null){//logic...}}public static class MessageBoxConfig{[CSharpCallLua]public static List<Type> CSharpCallLua = new List<Type>(){typeof(Action),typeof(Action<bool>),typeof(UnityAction),};}

message_box内部访问上述两个C#静态函数并利用async_to_sync 将其改造成同步函数,返回一个封装了这两个函数的表以供其他模块require

local util = require 'xlua.util'local sync_alert = util.async_to_sync(CS.XLuaTest.MessageBox.ShowAlertBox)
local sync_confirm = util.async_to_sync(CS.XLuaTest.MessageBox.ShowConfirmBox) --构造alert和confirm函数
return {alert = function(message, title)sync_alert(message, title)end;confirm = function(message, title)local ret = sync_confirm(message, title)return ret == trueend;}

测试逻辑

C#文件没什么好说的,主要是创建了一个lua环境并运行了luaenv.DoString(“require ‘async_test’”);语句来转到lua脚本的运行。

由下述lua代码可知流程:

首先使用message_box变量接message_box.lua模块构造好的同步函数表

然后自己构造一个模拟的异步充值的函数,再使用async_to_sync将其转换成同步函数

接下来是buy函数,该函数主要是用于为场景中的UI添加监听事件

内部逻辑:

  • ​ 首先没有余额判断,买就是提示余额不足
  • ​ 然后使用改造的同步函数confim,该函数原本为cb输入bool参数,现在变成同步函数返回值,用于判断按下的确认键还是取消键
  • ​ 根据分支打印不同内容,结束buy函数

定义完buy函数之后在场景中寻找Button(示例场景中只存在一个Button所以可以直接查找),为其添加该监听事件

local util = require 'xlua.util'
local message_box = require 'message_box'-------------------------async_recharge-----------------------------
local function async_recharge(num, cb) -- 模拟的异步充值print('requst server...')cb(true, num)
endlocal recharge = util.async_to_sync(async_recharge)
-------------------------async_recharge end----------------------------
local buy = function()message_box.alert("您余额不足,请充值!", "余额提醒")if message_box.confirm("确认充值10元吗?", "确认框") thenlocal r1, r2 = recharge(10)print('recharge result:', r1, r2)message_box.alert("充值成功!", "提示")elseprint('cancel')message_box.alert("取消充值!", "提示")endprint('recharge finished')
end
--将按钮监听点击事件,绑定buy方法
CS.UnityEngine.GameObject.Find("Button"):GetComponent("Button").onClick:AddListener(util.coroutine_call(buy))

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • .net 7和core版 SignalR
  • 【论文分享】测量城市夜间活力及其与城市空间结构的关系:一种数据驱动的方法
  • 软考-软件设计师 (计算机组成和体系结构习题)
  • Linux-入门-02
  • 【算法刷题日志】1044 最长重复子串和75 颜色分类,
  • 在Application中如何将集成三方框架初始化
  • c++的类和对象(上)
  • 鸿蒙(API 12 Beta2版)媒体开发【处理音频焦点事件】
  • 【电路笔记】-无源衰减器
  • websocket投送
  • Go语言本机多版本管理
  • 鸿蒙AI功能开发【hiai引擎框架-人脸比对】 基础视觉服务
  • 【OpenCV C++20 学习笔记】霍夫圆形变换-Hough Circle Transform
  • Can‘t import openai in Node
  • 2024 某公司python 面试真题
  • 【刷算法】求1+2+3+...+n
  • Android优雅地处理按钮重复点击
  • Essential Studio for ASP.NET Web Forms 2017 v2,新增自定义树形网格工具栏
  • Java,console输出实时的转向GUI textbox
  • JavaScript创建对象的四种方式
  • JS创建对象模式及其对象原型链探究(一):Object模式
  • Linux链接文件
  • Mocha测试初探
  • NSTimer学习笔记
  • QQ浏览器x5内核的兼容性问题
  • SOFAMosn配置模型
  • Vue 动态创建 component
  • Yeoman_Bower_Grunt
  • 翻译--Thinking in React
  • 前端性能优化——回流与重绘
  • 在Unity中实现一个简单的消息管理器
  • 《TCP IP 详解卷1:协议》阅读笔记 - 第六章
  • Redis4.x新特性 -- 萌萌的MEMORY DOCTOR
  • Spark2.4.0源码分析之WorldCount 默认shuffling并行度为200(九) ...
  • 进程与线程(三)——进程/线程间通信
  • 没有任何编程基础可以直接学习python语言吗?学会后能够做什么? ...
  • (C++17) std算法之执行策略 execution
  • (delphi11最新学习资料) Object Pascal 学习笔记---第2章第五节(日期和时间)
  • (ZT)一个美国文科博士的YardLife
  • (二)fiber的基本认识
  • (十六)串口UART
  • (最完美)小米手机6X的Usb调试模式在哪里打开的流程
  • .NET C# 使用 SetWindowsHookEx 监听鼠标或键盘消息以及此方法的坑
  • .NET CF命令行调试器MDbg入门(一)
  • .NET 中什么样的类是可使用 await 异步等待的?
  • .NET单元测试使用AutoFixture按需填充的方法总结
  • .net网站发布-允许更新此预编译站点
  • @for /l %i in (1,1,10) do md %i 批处理自动建立目录
  • [ IOS ] iOS-控制器View的创建和生命周期
  • [ solr入门 ] - 利用solrJ进行检索
  • []sim300 GPRS数据收发程序
  • [ACM] hdu 1201 18岁生日
  • [AIGC] 深入浅出 Python中的`enumerate`函数
  • [BZOJ] 1001: [BeiJing2006]狼抓兔子
  • [C#]使用C#部署yolov8-seg的实例分割的tensorrt模型