Y3编辑器Lua脚本中加载物编自定义数据
·
物编中单位,技能等自定义属性通过对象的kv_load,kv_save来读写更新。
但是KV.SupportTypeEnum中并没有把物编支持的类型都列举出来,虽然提示中说Integer可以用来取单位类型和技能类型等,但在实际操作过程中,例如取魔法效果类型时会报类型不匹配的错误。
如何解决呢?
查看官方代码
---@enum(key) KV.SupportTypeEnum
local apiAlias = {
Unit = 'unit_entity',
UnitKey = 'unit_name',
Ability = 'ability',
Item = 'item_entity',
Buff = 'modifier_entity',
Point = 'point',
Player = 'player',
Projectile = 'projectile_entity',
Destructible = 'destructible_entity',
Particle = 'sfx_entity',
Mover = 'mover_entity',
UnitGroup = 'unit_group',
UIPrefab = 'ui_prefab',
SceneUI = 'scene_ui',
}
---@param handle unknown
---@param key string
---@param lua_type 'boolean' | 'number' | 'integer' | 'string' | 'table' | KV.SupportTypeEnum
---@return any
local function kv_load_from_handle(handle, key, lua_type)
if lua_type == 'boolean' then
return GameAPI.get_kv_pair_value_boolean(handle, key)
end
if lua_type == 'integer' then
return GameAPI.get_kv_pair_value_integer(handle, key)
end
if lua_type == 'number' then
return y3.helper.tonumber(GameAPI.get_kv_pair_value_float(handle, key)) or 0.0
end
if lua_type == 'string' then
return GameAPI.get_kv_pair_value_string(handle, key)
end
if lua_type == 'table' then
return GameAPI.get_kv_pair_value_table(handle, key)
end
local alias = apiAlias[lua_type]
if alias then
local api = GameAPI['get_kv_pair_value_' .. alias]
if api then
local py_type = y3.py_converter.get_py_type(lua_type)
local py_value = api(handle, key)
local lua_value = y3.py_converter.py_to_lua(py_type, py_value)
return lua_value
end
end
error('不支持的类型:' .. lua_type)
end
可以发现,apiAlias中没有的类型会直接报错,支持的类型会调用GameAPI['get_kv_pair_value_' .. alias]对应的方法来获取值。
以魔法效果类型为例,apiAlias.Buff='modifier_entity',跳转到get_kv_pair_value_integer所在的文件y3/meta/gameapi1.lua,可以找到很多类似命名的方法,搜索一下get_kv_pair_value_modifier,可以找到如下代码
--获取MODIFIER_ENTITY键值对
---@param kvbase py.KVBase # 自定义键值载体
---@param key string # 键名称
---@return py.ModifierEntity # 键值
function GameAPI.get_kv_pair_value_modifier_entity(kvbase, key) end
--获取MODIFIER_TYPE键值对
---@param kvbase py.KVBase # 自定义键值载体
---@param key string # 键名称
---@return py.ModifierType # 键值
function GameAPI.get_kv_pair_value_modifier_type(kvbase, key) end
--获取MODIFIER_EFFECT_TYPE键值对
---@param kvbase py.KVBase # 自定义键值载体
---@param key string # 键名称
---@return py.ModifierEffectType # 键值
function GameAPI.get_kv_pair_value_modifier_effect_type(kvbase, key) end
--获取MODIFIER键值对
---@param kvbase py.KVBase # 自定义键值载体
---@param key string # 键名称
---@return py.ModifierKey # 键值
function GameAPI.get_kv_pair_value_modifier(kvbase, key) end
其中get_kv_pair_value_modifier就是返回魔法效果类型的方法,所以在apiAlias中增加modifier就可以用kv_load获得对应的值
---@enum(key) KV.SupportTypeEnum
local apiAlias = {
Unit = 'unit_entity',
UnitKey = 'unit_name',
Ability = 'ability',
Item = 'item_entity',
Buff = 'modifier_entity',
Point = 'point',
Player = 'player',
Projectile = 'projectile_entity',
Destructible = 'destructible_entity',
Particle = 'sfx_entity',
Mover = 'mover_entity',
UnitGroup = 'unit_group',
UIPrefab = 'ui_prefab',
SceneUI = 'scene_ui',
ModifierKey = 'modifier',
}
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐



所有评论(0)