【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))
相关推荐
WarPigs12 小时前
游戏签到系统
unity
小拉达不是臭老鼠15 小时前
Unity中的UI系统之UGUI
学习·ui·unity
万兴丶15 小时前
Coplay适用于 Unity 的“Al 代理”使用指南
unity·游戏引擎·ai编程
魔士于安18 小时前
Unity材质球大合集
unity·游戏引擎·材质
mxwin19 小时前
Unity Shader 冰面 Shader 制作原理与流程
unity·游戏引擎·shader
玖玥拾20 小时前
Cocos学习笔记:关卡系统、音频管理与物理控制
游戏引擎·cocos2d
小拉达不是臭老鼠21 小时前
Unity中的UI系统之UGUI_登陆面板实现
ui·unity
郝学胜-神的一滴21 小时前
[简化版 GAMES 101] 计算机图形学 11:频域·卷积·抗锯齿
c++·unity·图形渲染·opengl·three·unreal
玖玥拾1 天前
Cocos学习笔记:滚动视图、关卡系统与本地存储
游戏引擎·cocos2d
元气少女小圆丶2 天前
SenseGlove Nova 2+Unity开发笔记2
笔记·unity·游戏引擎