oUF MyLayout Addon
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 - 処理の最適化
- 設定値とコードの分離
- 設定画面
Comments


