IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> unity-lua单元测试 -> 正文阅读

[游戏开发]unity-lua单元测试


title: unity-lua单元测试
categories: Unity3d
tags: [unity, tolua, 单元测试]
date: 2022-01-02 12:19:51
comments: false
mathjax: true
toc: true

unity-lua单元测试


前篇

这里说的单元测试并不是真正意义上得单元测试, 只是为了开发中能不重启进程, 动态执行一些测试代码, 不然有些测试重现场景可能会比较耗时, 因此就需要有一种功能可以动态执行一些测试代码来验证是否能达到预期或者调试 bug.

这里是基于 unity 和 tolua 的实现, 其他引擎/其他脚本语言 (如: Python) 的话思路是一样.


步骤

核心就是重写 lua 全局函数, 然后执行 函数

  1. 扩展编辑器

    1. 读取 lua 脚本, 使用正则解析捕获到 要执行的方法, 如:

      private void Refresh() {
          EditorUtils.Assert(File.Exists(mCustomLuaPath), "--- 找不到文件: {0}", mCustomLuaPath);
          string txt = Utils.ReadAllTextFromFile(mCustomLuaPath);
          MatchCollection mthArr = new Regex(@"function\s+gDebugCustom.(\w+).*?\(").Matches(txt); // 正则捕获
          if (mthArr.Count == 0) {
              Debug.LogFormat("<color=#ff0000>--- 捕获方法失败</color>");
              return;
          }
      
          mFuncArr = new List<string>();
          for (int i = 0; i < mthArr.Count; i++) {
              mFuncArr.Add(mthArr[i].Groups[1].Value.Trim());
          }
      }
      
    2. 捕获的的方法 mFuncArr 绘制到 editor 中

    3. 添加执行 lua 的代码

      public void CallCustomLua(string luaFile, string funcName) {
          if (!EditorApplication.isPlaying) {
              EditorUtility.DisplayDialog("错误", "只能在运行时使用", "Ok");
              EditorUtils.Assert(false, "只能在运行时使用");
          }
      
          GameObject go = GameObject.Find("GameMgr");
          if (go == null) {
              EditorUtility.DisplayDialog("错误", "找不到 GameMgr", "Ok");
              EditorUtils.Assert(false, "找不到 GameMgr");
          }
      
          if (luaFile == null) {
              return;
          }
      
          GameMgr.CallLuaFunction("Debug_ExecCustomLua", luaFile, funcName);
      }
      
      
  2. lua 中添加一个全局函数, 执行动态代码

    -- 动态执行 自定义 lua 文件调试
    function Debug_ExecCustomLua(luaFile, funcName)
        local ok = xpcall(function()
            gAssert(Utils.IsFileExist(luaFile), "--- 找不到lua 文件, path: {0}", luaFile)
            dofile(luaFile) -- 加载动态代码
            gAssert(gDebugCustom, "--- 找不到全局 table: gDebugCustom")
            gAssert(type(gDebugCustom[funcName]) == "function", "--- 找不到 gDebugCustom.{0} 方法", funcName)
    
            gDebugCustom[funcName]()
        end, __G__TRACKBACK__)
        if ok then
            gLog("<color=#00ff00ff>--- gDebugCustom.{0} success!</color>", funcName)
        else
            gLog("<color=yellow>--- gDebugCustom.{0} execute fail!</color>", funcName)
        end
    end
    
  3. 添加 单元测试 lua 文件, 如: custom_unittest.lua , 里面就是需要动态执行的逻辑

    gDebugCustom = gDebugCustom or {}
    
    function gDebugCustom.Test001()
        gLog("--- Test001")
    end
    
    function gDebugCustom.Test002()
        gLog("--- Test002")
    end
    
  4. done.

    测试一下, 在 editor 中刷新一下方法, 然后执行


  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2022-01-04 13:45:22  更:2022-01-04 13:46:15 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年9日历 -2024/9/17 4:37:09-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码