Upgrade to Pro — share decks privately, control downloads, hide ads and more …

World of Warcraft Addon 完全実装ガイド

World of Warcraft Addon 完全実装ガイド

https://daisuke.masuda.tokyo/article-2025-11-18-0805

このスライドはWorld of WarcraftのAddom開発に関する完全ガイドです。デバッグ手法として、条件付きデバッグ出力の実装方法(DEBUG フラグの使用)、エラー発生時のスタックトレース取得、ViragDevToolとの連携などを解説しています。また、高速な反復開発のために/reloadコマンドを使ってゲームを再起動せずにコード変更をテストする方法や、SavedVariables使用時のPLAYER_LOGOUTイベントへの注意点、_Gテーブルの調査によるグローバル変数漏れの特定方法など、実践的な開発ワークフローとベストプラクティスが紹介されています。

Avatar for Daisuke Masuda

Daisuke Masuda PRO

November 17, 2025
Tweet

More Decks by Daisuke Masuda

Other Decks in Programming

Transcript

  1. World of Warcraft World of Warcraft Addon Development Addon Development

    Complete Guide Complete Guide 環境構築からデバッグまで Lua 5.1 FrameXML API In-game tooling
  2. WoW Addonとは 有名なAddon例 WeakAuras DBM ElvUI Details! Plater ElvUI -

    最も人気のあるUIカスタマイズAddon Lua 5.1ベースのUIカスタマイズ拡張機能 • BlizzardのFrameXML APIを使用 • 主要な用途:UI改善、情報表示、戦闘支援、QoL機能 •
  3. IDE比較:VSCode vs IntelliJ IDEA VS Code 強み IntelliJ IDEA 強み

    両方ともEmmyLuaスタイルのアノテーションに対応 - 生産性の高い方を選びましょう 軽量で起動が速い • 拡張機能のエコシステムが豊富 • 低リソース消費でも十分なパフォーマンス • wow-bundle と WoW API拡張で対応 • 初心者からの学習曲線が緩やか • 小〜中規模のAddon開発に最適 • 無料、オープンソース • 強力なリファクタリング機能 • 高度なナビゲーションとコード分析 • EmmyLuaプラグインで完全なLua IDE環境 • 大規模プロジェクトに対応する堅牢な機能 • JavaなどJVM言語との連携が容易 • 大規模なAddon開発や複雑なプロジェクトに最適 • Community Edition(無料)でも十分に使える •
  4. VSCodeセットアップ(オプション 1) 必須拡張機能 主な機能 WoW 8.0.1 API対応 コードスニペット シンタックスハイライト .tocファイル対応

    // クイックインストール(Ctrl+P) ext install Septh.wow-bundle ext install ketho.wow-api // または拡張機能パネルから検索 // 「wow-bundle」「WoW API」 // Lua Language Serverの設定(settings.json) { "Lua.workspace.library": [ "path/to/wow-api-library" ] } ヒント: Wow-bundleのテーマを有効化するとコード表示が最適化されます wow-bundle - WoW用Lua文法、.tocファイル対応 • WoW API for LuaLS - APIコード補完とドキュメント • 軽量で起動が速く、小〜中規模のAddonに最適 •
  5. IntelliJ IDEAセットアップ(オプション 2) インストール手順 1 File > Settings > Plugins

    を開く 2 「Marketplace」タブで "EmmyLua" を検索 3 オリジナルEmmyLua(ID: 9768)を選択してインストール 4 IDEを再起動 オリジナルEmmyLuaを選ぶ理由 EmmyLua2との違い EmmyLuaプラグインをJetBrains Marketplaceからインストール • オリジナルEmmyLua(Plugin ID: 9768)を推奨 • Community Edition(無料版)でも完全対応 • 安定性 6年以上の開発実績と成熟したコードベース • WoW互換 Ellypse(Total RP 3開発者)による実証済み実装 • Lua 5.1 WoW Addonの基盤言語に完全対応 • EmmyLua2は新しいRust製エンジンで高速だが発展途上 • EmmyLua2はまだWoW API連携の実績が少ない • 将来的にはEmmyLua2への移行も検討価値あり •
  6. IntelliJ: Lua SDK手動作成 💡 推奨SDK名 Lua 5.1 または WoW Lua

    SDK 💡 重要なヒント 実際のLua実行環境は不要です。SDK設定は単にIntelliJにLuaコードと して認識させるためのもので、WoWがLua環境を提供します。 💡 SDKのプロジェクト紐付け Project StructureのProjectタブでSDKを選択し、Applyボタンをクリッ クしてプロジェクトに適用します。 Project Structure > Project > Project SDK IntelliJ IDEAのメニューからFileを選択 1 Project Structureをクリック File > Project Structure 2 左側のパネルからSDKsを選択 3 上部の+ボタンをクリックし、ドロップダウンからAdd Lua SDK を選択 4 任意のフォルダを選択(実際にLua環境を入れる必要はありま せん) 5 Project StructureのProjectタブで作成したSDKを選択してApply 6
  7. WoW APIライブラリの追加 IntelliJ IDEAのLua SDKに以下のリポジトリをクローンして追加します: WoW API定義ファイル Ellypse/IntelliJ-IDEA-Lua-IDE-WoW-API WoW APIのドキュメントとコード補完用のスタブファイル

    WoW UI ソースコード Ellypse/wow-ui-source または Gethe/wow-ui-source Blizzard公式のUIソースコードとXMLスキーマ 1 API関数の自動補完 WoW関数のコード補完、パラメータヒント、ドキュメンテーションが 利用可能に 2 Widgetメソッド補完 Buttonなどの型指定でFrameなど継承したメソッドも自動補完 3 XML補完とヒント UI.xsdを利用したXMLファイルの編集支援とエラーチェック 4 APIドキュメント表示 関数にカーソルを合わせるとドキュメントがポップアップ表示 ⚠️ 重要なTip ライブラリ追加後は、File > Invalidate Caches / Restart を実行して、 IntelliJ IDEAにキャッシュをクリアさせ、変更を適用させてください。 1 リポジトリをローカルにクローン • 2 Project Structure > SDKs > Lua SDK • 3 Classpathタブで+ボタンをクリック • 4 クローンしたリポジトリを選択して追加 •
  8. 基本的なAddon構造 配置場所 _retail_/Interface/AddOns/MyAddon/ ├ MyAddon.toc ├ MyAddon.lua └ [その他のファイル] .tocファイルの重要フィールド

    フィールド 説明 ## Interface: 110002 WoWバージョン番号(必須) ## Title: My Addon Addonタイトル(必須) ## Author: YourName 作者名 ## Version: 1.0 バージョン番号 ## SavedVariables: DB 保存する変数(オプション) Tip: ロード順序 ファイルは.tocファイル内で記載された順にロードされます。依存関 係がある場合は、必ず先に必要なファイルをリストしてください。 必須ファイル: • MyAddon.toc (マニフェストファイル) • MyAddon.lua (メインコード) • オプションファイル: • *.xml (UIレイアウト) • Localization/*.lua (翻訳) •
  9. Hello World: 最小限の動作例 MyAddon.toc ## Interface: 110002 ## Title: My

    First Addon ## Author: YourName MyAddon.lua このコードは実際にコピー&ペーストして動作します。Interface番号は現在の WoWパッチに合わせて変更してください。 MyAddon.lua -- フレームを作成してPLAYER_LOGINイベントを監視 local f = CreateFrame("Frame") f:RegisterEvent("PLAYER_LOGIN") f:SetScript("OnEvent", function(self, event) print("Hello WoW Addon World!") end) -- これだけで動作する最小限のAddon -- /reloadでリロード、ゲームログに「Hello WoW Addon World!」と 表示
  10. ゲーム内デバッグツール 主要な/vdtコマンド /vdt - UIの表示/非表示 /vdt help - ヘルプの表示 /vdt

    eventadd EVENT_NAME [unit] - イベント監視追加 /vdt eventremove EVENT_NAME - イベント監視削除 変数・テーブル監視の例: -- グローバル変数の監視 if ViragDevTool_AddData then ViragDevTool_AddData(_G, "グローバル変数") ViragDevTool_AddData(MyAddon, "MyAddon") end デバッグ関数のラッパー例: local DEBUG = true local function Debug(name, data) if DEBUG and ViragDevTool_AddData then ViragDevTool_AddData(data, name) end end -- 使用例 Debug("プレイヤーフレーム", PlayerFrame) イベント監視の例: -- チャットで実行 /vdt eventadd UNIT_AURA player /vdt eventadd COMBAT_LOG_EVENT_UNFILTERED DevTool(ViragDevTool):アドオン開発者向けの強力なデバッグ ツール • テーブル・フレーム・変数の視覚的検査(リアルタイム) • ゲームイベントの監視とフィルタリング • 関数呼び出しのトレースと引数/戻り値のログ •
  11. コード内デバッグ手法 条件付きデバッグ関数 使用例 スタックトレース取得 高速反復開発 -- 条件付きデバッグ出力(必要に応じてON/OFF切替) local DEBUG =

    true local function Debug(...) if DEBUG then if ViragDevTool_AddData then ViragDevTool_AddData({...}, "MyAddon") else print("|cFF00FF00[MyAddon]|r", ...) end end end Addonのトップに条件付きデバッグ関数を定義し、リリース前にDEBUG = falseに変更するだけで、全てのデバッグメッセージをオフにできま す。 BEST PRACTICE Debug("プレイヤー名:", UnitName("player")) Debug("ステータス:", {health=100, mana=50}) -- スタックトレース関数 function GetStackTrace() return debugstack(2) -- 現在のスタックを除外 end -- エラー発生時に詳細情報を記録 local success, err = pcall(function() -- 危険な操作 -- local n = nil + 1 -- 故意のエラー end) if not success then Debug("エラー:", err) Debug("スタックトレース:", GetStackTrace()) end チャットコマンド /reload または /rl でUI全体を再読み込 み • Addonコードの変更をゲームを再起動せずにテスト可能 • SavedVariablesがあれば PLAYER_LOGOUT イベント発火に注意 • デバッグ中に _G テーブルを調査すると、予期せぬグローバル変数漏れ を特定できます: ViragDevTool_AddData(_G, "Global Variables") TIP
  12. EmmyLuaアノテーション活用 型定義とメタデータ付与で強力なコード補完を実現 クラス・フィールド定義 ---@class MyAddon ---@field db table データベース ---@field

    config table 設定テーブル local MyAddon = {} 関数パラメータと戻り値 ---@param frame Button ボタンウィジェット ---@param text string 表示テキスト ---@return boolean success function MyAddon:Setup(frame, text) frame:SetNormalTexture("Interface\\Buttons\\UI-Button") frame:SetText(text) return true end Widget継承による補完機能 Button ↓ Frame ↓ Region ↓ UIObject アノテーションを使うとButtonには全ての継承メソッドが補完表示されま す: 複数IDE対応 EmmyLuaアノテーションは主要開発環境で動作: IntelliJ IDEA + EmmyLua VS Code + LuaLS 同じアノテーション形式でコード補完、ドキュメント表示、型チェック が可能 button:SetText() - Button固有メソッド • button:SetSize() - Frameから継承 • button:SetAlpha() - Regionから継承 •
  13. まとめ&次のステップ  開発環境のまとめ  デバッグ手法のまとめ  学習リソース  コミュニティ 

    次のステップ SavedVariables イベント処理 UI XML ウィジェット作成 ライブラリ利用 プロファイリング 国際化 セキュリティ 選択肢1: VSCode + wow-bundle + WoW API for LuaLS • 選択肢2: IntelliJ IDEA + EmmyLua + WoW API stubs • どちらも環境でもEmmyLuaアノテーションが活用可能 • DevTool/ViragDevTool: テーブル・変数の視覚的検査 • 条件付きprint: DEBUG変数でOn/Off制御 • debugstack(): エラー発生時のコールスタック取得 • /reload: UIリロードで高速反復開発 • warcraft.wiki.gg - WoW API公式リファレンス • Wowhead Lua Guide - 初心者向けチュートリアル • GitHub - 既存Addonのコード研究(ElvUI, WeakAuras等) • r/wowaddons - Reddit開発者コミュニティ • WoWInterface Forums - 質問・回答・情報交換 • CurseForge - アドオン公開プラットフォーム •