物编中单位,技能等自定义属性通过对象的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',
}

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐