AIを使ってoUFフレームワークを利用したWorld of Warcraftのユニットフレームアドオンを作ってみました。
Visual Studio Code にGemini Code Assist拡張を組み込みました。実装を確かめながら機能を追加できます。Geminiは混雑時にレスポンスが悪いものの、無料であるにも関わらずコンパクトで間違いの無いコードを生成するような気がします。ある程度進んだら設定値とコードの分離、処理の最適化を図りたいと思います。

https://marketplace.visualstudio.com/items?itemName=Google.geminicodeassist
https://github.com/oUF-wow/oUF


中央左からPlayer、Pet、Targetのユニットフレームです。

環境

開発環境

  • Visual Studio Code
    • Gemini Code Assist拡張

フォルダ構成

  • ソースコード
    oUF_MyLayout/
    ├── libs/
    │   └── oUF/
    │      └── oUF.xml
    ├── media/
    │   ├── fonts/
    │   │ └── Prototype.ttf
    │   └── textures/
    │      ├── Gradient.tga
    │      └── Minimalist.tga
    ├── oUF_MyLayout.toc
    └── oUF_MyLayout.lua

構築

oUFの取得

  • git clone
    cd oUF_MyLayout/libs/
    git clone https://github.com/oUF-wow/oUF.git

ソースコード

  • TOC
    oUF_MyLayout/oUF_MyLayout.toc
    ## Interface: 110207
    ## Title: oUF MyLayout
    ## Author: YourName
    ## Version: 1.0

    libs\oUF\oUF.xml
    oUF_MyLayout.lua
  • メイン処理
    oUF_MyLayout/oUF_MyLayout.lua
    local addonName, ns = ...
    -- oUFオブジェクトを取得(グローバルまたはネームスペースから)
    local oUF = ns.oUF or oUF

    -- ------------------------------------------------------------------------
    -- スタイル定義関数 (Shared Style Function)
    -- ------------------------------------------------------------------------
    -- この関数内で、各ユニットフレーム(プレイヤー、ターゲット等)の見た目を定義します。
    local function Shared(self, unit)
    -- 1. フレームの基本設定
    self:RegisterForClicks("AnyUp")
    self:SetScript("OnEnter", UnitFrame_OnEnter)
    self:SetScript("OnLeave", UnitFrame_OnLeave)

    -- フレームのサイズ設定 (幅230px, 高さ50px)
    if unit == "pet" then
    self:SetSize(134, 47)
    else
    self:SetSize(254, 47)
    end

    -- 背景の設定 (オプション)
    local bg = self:CreateTexture(nil, "BACKGROUND")
    bg:SetAllPoints()
    bg:SetColorTexture(0, 0, 0, 1) -- 半透明の黒

    -- --------------------------------------------------------------------
    -- 2. Health Bar (HPバー) の作成
    -- --------------------------------------------------------------------
    local Health = CreateFrame("StatusBar", nil, self)
    Health:SetPoint("TOPLEFT", self, "TOPLEFT", 2, -2)
    Health:SetPoint("TOPRIGHT", self, "TOPRIGHT", -2, -2)
    Health:SetHeight(30) -- HPバーの高さ
    -- Health:SetStatusBarTexture("Interface\\BUTTONS\\WHITE8X8") -- シンプルなテクスチャ
    Health:SetStatusBarTexture("Interface\\Addons\\oUF_MyLayout\\media\\textures\\Gradient.tga")
    Health:SetStatusBarColor(0.25, 0.25, 0.25) -- #404040

    -- HPバーの背景
    local HealthBg = Health:CreateTexture(nil, "BACKGROUND")
    HealthBg:SetAllPoints(true)
    HealthBg:SetColorTexture(0.2, 0.2, 0.2)
    HealthBg.multiplier = 0.2

    -- オプション: クラスカラーや敵対反応カラーを有効化
    Health.colorTapping = true
    Health.colorDisconnected = true
    Health.colorClass = false
    Health.colorReaction = false
    Health.bg = HealthBg

    -- oUFに登録 (self.Healthに代入することでoUFが自動更新を行う)
    self.Health = Health

    -- --------------------------------------------------------------------
    -- 3. Power Bar (マナ/リソースバー) の作成
    -- --------------------------------------------------------------------
    local Power = CreateFrame("StatusBar", nil, self)
    Power:SetPoint("TOPLEFT", Health, "BOTTOMLEFT", 0, -2)
    Power:SetPoint("TOPRIGHT", Health, "BOTTOMRIGHT", 0, -2)
    Power:SetPoint("BOTTOM", self, "BOTTOM", 0, 2)
    Power:SetStatusBarTexture("Interface\\Addons\\oUF_MyLayout\\media\\textures\\Minimalist.tga")

    local PowerBg = Power:CreateTexture(nil, "BACKGROUND")
    PowerBg:SetAllPoints(true)
    PowerBg:SetColorTexture(0.2, 0.2, 0.2)
    PowerBg.multiplier = 0.2

    Power.colorClass = true -- クラスカラー
    Power.bg = PowerBg

    -- oUFに登録
    self.Power = Power

    -- --------------------------------------------------------------------
    -- 4. テキスト情報 (名前とHP値)
    -- --------------------------------------------------------------------
    -- 名前
    local Name = Health:CreateFontString(nil, "OVERLAY")
    Name:SetFont("Interface\\Addons\\oUF_MyLayout\\media\\fonts\\Prototype.ttf", 20, "OUTLINE")
    if unit == "pet" then
    Name:SetPoint("BOTTOM", Health, "BOTTOM", 0, -25)
    Name:SetTextColor(1, 1, 1) -- 白色
    else
    Name:SetPoint("TOPLEFT", self, "BOTTOMLEFT", 0, 0)
    end
    self:Tag(Name, "[name]") -- oUFのタグシステムを使用
    self.Name = Name

    -- HP数値
    if unit ~= "pet" then
    local HpVal = Health:CreateFontString(nil, "OVERLAY")
    HpVal:SetFont("Interface\\Addons\\oUF_MyLayout\\media\\fonts\\Prototype.ttf", 24, "OUTLINE")
    HpVal:SetPoint("RIGHT", Health, "RIGHT", 0, 0)
    self:Tag(HpVal, "[perhp]%") -- パーセント表示
    end

    -- --------------------------------------------------------------------
    -- 5. Portrait (3Dモデル)
    -- --------------------------------------------------------------------
    if unit ~= "pet" then
    local Portrait = CreateFrame("PlayerModel", nil, self)
    Portrait:SetSize(150, 43)
    Portrait:SetPoint("LEFT", self, "LEFT", 0, 0) -- フレームの右側に配置

    -- 背景 (オプション)
    local PortraitBg = self:CreateTexture(nil, "BACKGROUND")
    PortraitBg:SetAllPoints(Portrait)
    PortraitBg:SetColorTexture(0, 0, 0, 0.5)

    self.Portrait = Portrait
    end
    end

    -- ------------------------------------------------------------------------
    -- ファクトリー (Factory)
    -- ------------------------------------------------------------------------
    -- スタイルを登録し、実際にフレームを生成(Spawn)します。

    oUF:RegisterStyle("MyLayout", Shared)

    oUF:Factory(function(self)
    self:SetActiveStyle("MyLayout")

    -- プレイヤーフレームの生成と配置
    local player = self:Spawn("player")
    player:SetPoint("CENTER", -200, -300)

    -- ターゲットフレームの生成と配置
    local target = self:Spawn("target")
    target:SetPoint("CENTER", 200, -300)

    -- ペットフレームの生成と配置
    local pet = self:Spawn("pet")
    pet:SetPoint("CENTER", 0, -300)

    -- フォーカスフレームなども同様に追加可能
    -- self:Spawn("focus"):SetPoint("CENTER", 0, -100)
    end)

設置

  • アドオンフォルダにコピー
    Copy-Item -Path "C:\repos\oUF_MyLayout" -Destination "C:\Program Files (x86)\World of Warcraft\_retail_\Interface\AddOns\" -Recurse -Force

TODO

  • ユニットフレームの追加
    target-target, pet-target,
    party, party-target, party-pet
    raid, maintank, maintank-target, boss, boss-target,
    arena, arena-target
  • 処理の最適化
  • 設定値とコードの分離
  • 設定画面