xjz497901194 发表于 2023-3-27 18:34

基础框架 LuaEnv,支持使用 lua 写 mod

本帖最后由 xjz497901194 于 2023-3-27 18:37 编辑

工坊搜索 LuaEnv(可能还在审核中) ,也可以自己从 github 下载编译 https://github.com/xiejiangzhi/LuaEnvForGGBH

本框架加入了 NLua,支持以 lua 访问 C# 环境,也就是说,基本上 c# mod 能做的事,这里都能做了,更多使用我也不清楚了,因为自己 C# 不了解,都是抄的代码。

对于 mod 新手来说,lua 代码更简单。
对于高手来说, lua 相对来说更方便,你更新代码后,不需要重启游戏,只要重新导出就可以运行了。

为了简单使用,我加入了几个接口可以书摘定义自己的剧情 function 与 condition


订阅 LuaEnv 框架后,你就可以在你自己的 mod 里面写 lua 了。

使用说明

增加 main.lua首先在你自己的 mod 项目的 ModAssets 中创建一个 Scripts 目录,然后加入一个 main.lua 到 Scripts 文件中。LuaEnv 会自动查找所有已加载的 mod,并检查是否有 main.lua, 如果有就会自动加载。 每个 main.lua 执行 require 时都会优先从自己的 Scripts 目录下查找。然后我们就可以在 main.lua 文件中创建自己的function 与 condition 了。由于是导出的 NLua,如果你对这个以及 C# 熟悉的话,你可以直接做 C# 可以做的事了。### AddFunc

增加剧情函数

-- fn_name 可以是任意字符,但不要有 `_`, 因为调用时是以 `_` 分隔的
-- 最好的你的 `{ModName}.{FuncName}`
-- 比如你的 mod 叫 BestMod, 那就可以用 `BestMod.Xxx` 前缀去定义名字,这样可以避免和别人的 mod 冲突
local fn_name = 'MyMod.MyFunc'
AddFunc(fn_name, function(name, df, args)
-- name 等于 fn_name
-- df: DrameFunction 剧情数据,可以取到剧情角色啥的,具体可以看官方代码文档

-- 这里简单演示打印一些数据到控制台
print('Inside lua test func', name, df, args)
print('left', df.data.unitLeft)
print('right', df.data.unitRight)
print('UnitA', df.data.unitA)

-- g 是 C# 里面定义的,这里可以直接取到,基本上 C# 里面的大多都可以直接在 lua 里调用和实现了
-- 具体使用要看 NLua ,我也不太了解
print('g', g, g.world.playerUnit)

-- args 里面就是调用的所有参数, 所有参数都是字符串
-- 比如 addFeature_lua_MyMod.MyFunc_123_asdf_321, 这里 args 就有3个, 分别是 123, asdf, 321
for i = 0, args.Length - 1 do
    print(i, args)
end
end)
通过 json 中的 function 调用 `addFeature_lua_MyMod.MyFunc_arg1_arg2`

### AddCond
增加条件函数
-- cond_name 可以是任意字符,但不要有 `_`, 因为调用时是以 `_` 分隔的
-- 最好的你的 `{ModName}.{CondName}`
local cond_name = 'MyMod.MyCond'
AddFunc(cond_name, function(name, dc, args)
-- name 等于 cond_name
-- dc: DrameCondition 条件数据,可以取到条件角色啥的,具体可以看官方代码文档

-- 这里简单演示打印一些数据到控制台
print('Inside lua test cond', name, dc, args)
print('unitA', dc.data.unitA)
print('unitB', dc.data.unitB)
print('unitC', dc.data.unitC)
print('args len', args.Length)

-- 条件参数, 所有都是字符串 数字需要 tonumber(args) 转换
for i = 0, args.Length - 1 do
    print(i, args)
end
-- 必须返回一个 bool 值来决定这个条件是否通过, true 通过, false 失败
return true
end)通过 json 中的 condition 调用 `lua_MyMod.MyFunc_arg1_arg2`

另外工坊还上传了一个示例项目 LuaEnv Example ,示例走到步后,就会触发一个奇遇对话,然后里面的增加 HP,比较 HP与MP 的条件与功能都是通过 lua 实现的。可以参考下(也不知道审核过了没)
会 C# 的高手可以来点 PR ,因为我基本不会 C#,所有代码写的可能有点烂了。



johnor 发表于 2023-4-2 16:11

lua确实简单了很多,就算不懂代码的小白也能很快上手

xjz497901194 发表于 2023-4-2 19:03

已经更新好几个版本了,目前已经支持比较简单的热更新,可以实现代码保存后,游戏中立马生效。
我自己也使用 lua 写了两个 mod,一个扩展接口,一个读取自定义的 json 配置来扩展对话剧情
有兴趣的可以加群 565139209 交流。

y360500756 发表于 2023-6-20 12:39

不错,帮忙顶一下

canqing99 发表于 2023-9-8 02:02

66666666666666666666666666666666666666666666666

3dm_18821883 发表于 2024-8-5 15:02

感谢分享
页: [1]
查看完整版本: 基础框架 LuaEnv,支持使用 lua 写 mod