1. 基础原理

  • 当单位没有任何主动技能时,魔兽游戏会自动隐藏技能栏
  • 可以通过触发器动态管理技能实现隐藏/显示效果
  • 2. 实现步骤

    jass

    // 触发器示例

    function HideAbility takes nothing returns nothing

    local unit u = YourUnit // 替换为你的争霸中单位变量

    call UnitRemoveAbility(u, 'A000') // 移除主动技能A

    call UnitRemoveAbility(u, 'A001') // 移除主动技能B

    // 添加被动技能占位(可选)

    call UnitAddAbility(u, 'A002') // A002为被动技能ID

    endfunction

    function ShowAbility takes nothing returns nothing

    local unit u = YourUnit

    call UnitAddAbility(u, 'A000') // 重新添加主动技能A

    call UnitAddAbility(u, 'A001') // 重新添加主动技能B

    // 移除被动占位技能

    call UnitRemoveAbility(u, 'A002')

    endfunction

    3. 优化方案(推荐使用工程升级)

    1) 创建两个单位类型:

  • 基础单位(带主动技能)
  • 替代单位(技能替换为被动版本)
  • 2) 使用触发器替换单位:

    jass

    call ReplaceUnitBJ( oldUnit, newUnitType, bKeepHealth )

    4. 高级技巧

  • 使用`UnitMakeAbilityPermanent`防止技能被意外移除
  • 结合`BlzUnitHideAbility`函数(需要新版本编辑器支持)
  • 利用`UnitDisableAbility`禁用但不隐藏技能
  • 5. 注意事项

  • 确保单位至少有一个被动技能来避免界面异常
  • 技能图标残留问题可通过重置选择单位解决:
  • jass

    call SelectUnit(YourUnit, false)

    call SelectUnit(YourUnit, true)

    6. 动态控制方案

    jass

    // 通过自定义值控制技能状态

    if GetUnitUserData(u) == 0 then

    call ShowAbility

    call SetUnitUserData(u, 1)

    else

    call HideAbility

    call SetUnitUserData(u, 0)

    endif

    建议优先使用工程升级方案,这种方法更稳定且兼容性好。单位如果需要完全隐藏,设置可以创建1x1像素的可隐透明技能图标作为占位符。

    魔兽