Lua 技巧
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Lua 技巧相关的知识,希望对你有一定的参考价值。
参考技术A 1、剔除字符串中的“,”逗号function LuaKill:findNum( str )
local allStr = str .. ","
local tabNum =
while allStr do
local len = string.len( allStr )
local m = string.find( allStr, "," )
local num = string.sub(allStr, 1, m-1)
table.insert( tabNum, 1, num )
if m >= len then
allStr = nil
return tabNum
end
allStr = string.sub( allStr, m+1, len )
end
return tabNum
end
这个函数可以从字符串中剔除逗号拿到数据
比如: str = "1,2,3,4,5,6,7,8,9,10"
调用 findNum( str )
返回一个装有 1到 10 数字的表1,2,3,4,5,6,7,8,9,10
2、从字符串中取数字
function LuaKill:findNum( str )
local num = ""
local len = string.len( str )
for i = 1, len do
local assic = string.byte( str, i )
if assic <= 57 and assic>= 48 then
num = num .. string.sub( str, i, i )
end
end
return tonumber( num)
end
例如: str = “asdf123shjk”
find(str) 结果为: 123
3、Lua使用Switch
Lua中没有Switch关键字 但是我们在程序中很多时候都要用到,Lua也可以实现Switch,如下:
function LuaKill:switch( tag )
local onButtonClicked =
[1] = function()
print("tag = 1")
end,
[2] = function()
print("tag = 2")
end,
[3] = function()
print("tag = 3")
end,
onButtonClicked [tag]( )
end
根据Tag的不同调用 不同的函数
lua-调试技巧
title: lua-调试技巧
categories: Lua
tags: [lua, 调试, 技巧]
date: 2022-07-14 16:31:27
comments: false
mathjax: true
toc: true
lua-调试技巧
前篇
游戏 lua 脚本调试技巧, 达到修改逻辑脚本后能实时生效执行, 提高开发效率
pc 端 editor 模式
-
新建一个测试代码脚本
gDebugCustom = gDebugCustom or function gDebugCustom.Test01() gLog("--- Test01") end
-
editor 增加解析这个脚本, 显示出 按钮
-
点击按钮去执行对应的方法
-
csharp
GameMgr.CallLuaFunction("Debug_ExecCustomLua", luaFile, funcName);
-
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
-
-
移动端
下载 lua
-
在 [pc 端 editor 模式](#pc 端 editor 模式) 测试脚本上增加一个全局方法
gDebugWebFn
, 用来 web 执行gDebugCustom = gDebugCustom or function gDebugCustom.Test01() gLog("--- Test01") end -- 增加的全局方法 gDebugWebFn = function() gDebugCustom.Test01() end
-
游戏调试 ui 按钮上去执行一个下载测试脚本, 并执行
gDebugWebFn
local function testDynamicLua() local url = "http://192.168.1.200:59090/lua/custom_unittest.lua" gTool.SafeDoString(url, function(isStop, msg) gLog("<color=#ffff00>--- gTool.SafeDoString, isStop: 0</color>, msg: 1", isStop, msg) gAssert(type(gDebugWebFn) == "function", "--- 找不到全局调试方法 gDebugWebFn") gDebugWebFn() end) end
进阶
-
动态执行的脚本, 再次动态下载其他逻辑脚本, 这样会重写 lua 方法, 达到实时刷新脚本逻辑
-- 避免出现在 unity editor中 gDebugCustom.requireExt = function(luaPath, callback) local luaDirUrl = "http://192.168.1.200:59090/require" local newPath = string.gsub(luaPath, "%.", "/") local relaPath = string.formatExt("0.lua", newPath) local fullUrl = string.formatExt("0/1", luaDirUrl, relaPath) -- gLog("--- fullUrl: 0", fullUrl) local cbWrap = function(isOk, res) gAssert(isOk, "--- url require fail, luaPath: 0, fullUrl: 1", luaPath, fullUrl) gLog("<color=#00ff00>--- url require success</color>, luaPath: 0, fullUrl: 1", luaPath, fullUrl) if callback then callback(res) end end gBestHttpMgr:GetData(fullUrl, function(isSucc, data) if isSucc and not IsNull(data) then local text = Utils.BytesToUTF8(data) local ok, res = xpcall(loadstring(text), __G__TRACKBACK__) if not ok then cbWrap(false, "do remote string error") else -- 移动端非 ab 模式, 写入本地 if gLogicTool.IsMobile() and not Const.LuaBundleMode then local fullPath = gTool.PathJoin(Application.persistentDataPath, Const.kResluaDir, relaPath) Utils.WriteFileUTF8(fullPath, text) end cbWrap(true, res) end else cbWrap(false, "Network error") end end) end function gDebugCustom.Dynamic() local function testGm() gDebugCustom.requireExt("logic.common.gm", function() local input = "show me the log" local isOk = gGmMgr:Do(input) gLog("--- gm ok: 0", isOk) end) end -- 测试 testGm() end
Android 端拷贝 lua
明文 lua 的方式, 可以直接将项目内的 lua 脚本用 adb 命令拷到包体目录下, 然后重启游戏 or 重启 lua 虚拟机
-
adb 命令
$ adb push E:/its/rummy_itc-v4/z_tempSave/lua /sdcard/Android/data/com.aaa.bbb/files
以上是关于Lua 技巧的主要内容,如果未能解决你的问题,请参考以下文章