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

文章目录

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

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

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

工具脚本

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

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

cs 复制代码
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

lua 复制代码
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 == true
    end;
 }

测试逻辑

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所以可以直接查找),为其添加该监听事件

lua 复制代码
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)
end

local recharge = util.async_to_sync(async_recharge)
-------------------------async_recharge end----------------------------
local buy = function()
    message_box.alert("您余额不足,请充值!", "余额提醒")
	if message_box.confirm("确认充值10元吗?", "确认框") then
		local r1, r2 = recharge(10)
		print('recharge result:', r1, r2)
		message_box.alert("充值成功!", "提示")
	else
	    print('cancel')
	    message_box.alert("取消充值!", "提示")
	end
	print('recharge finished')
end
--将按钮监听点击事件,绑定buy方法
CS.UnityEngine.GameObject.Find("Button"):GetComponent("Button").onClick:AddListener(util.coroutine_call(buy))
相关推荐
黄名富4 分钟前
Redis 附加功能(二)— 自动过期、流水线与事务及Lua脚本
java·数据库·redis·lua
每日出拳老爷子2 小时前
【图形渲染】【Unity Shader】【Nvidia CG】有用的参考资料链接
unity·游戏引擎·图形渲染
北海65163 小时前
Dots 常用操作
unity
染指11104 小时前
50.第二阶段x86游戏实战2-lua获取本地寻路,跨地图寻路和获取当前地图id
c++·windows·lua·游戏安全·反游戏外挂·游戏逆向·luastudio
YY-nb10 小时前
Unity Apple Vision Pro 开发教程:物体识别跟踪
unity·游戏引擎·apple vision pro
Cool-浩10 小时前
Unity 开发Apple Vision Pro物体识别追踪ObjectTracking
unity·ar·apple vision pro·mr·物体识别·vision pro教程·objecttracking
spencer_tseng13 小时前
WeakAuras NES Script(lua)
lua·wow·nes·weakauras
红黑色的圣西罗19 小时前
xlua中自定义lua文件加载的一种方式
lua
法外狂徒张三!21 小时前
Roblox踩坑1——动画无法完整播放
lua·roblox
向宇it1 天前
【从零开始入门unity游戏开发之——C#篇23】C#面向对象继承——`as`类型转化和`is`类型检查、向上转型和向下转型、里氏替换原则(LSP)
java·开发语言·unity·c#·游戏引擎·里氏替换原则