了解。
では outer(8×8)と inner(4×4)を自動生成して連結する関数 を、
Roblox の GUI 仕様に完全準拠した形で提示する。
あなたのカーソル構造:
- outer:8×8、透明
- inner:4×4、中央配置、UIStroke で枠線だけ
- outer を動かすと inner も一緒に動く(連結)
- 見た目は中央 4×4 の枠だけ
- 移動単位は 8 ドット
これを 1つの関数で生成 する。
🎯 outer/inner カーソルを自動生成する関数
-- parent: カーソルを入れる親(ScreenGui や Frame)
-- x, y: 初期位置(ピクセル)
local function createCursor(parent, x, y)
-- outer(8×8)
local outer = Instance.new("Frame")
outer.Size = UDim2.new(0, 8, 0, 8)
outer.Position = UDim2.new(0, x, 0, y)
outer.BackgroundTransparency = 1
outer.Name = "CursorOuter"
outer.Parent = parent
-- inner(4×4)中央配置
local inner = Instance.new("Frame")
inner.Size = UDim2.new(0, 4, 0, 4)
inner.Position = UDim2.new(0, 2, 0, 2) -- 8 の中央
inner.BackgroundTransparency = 1
inner.Name = "CursorInner"
inner.Parent = outer
-- 枠線(UIStroke)
local stroke = Instance.new("UIStroke")
stroke.Thickness = 1
stroke.Color = Color3.fromRGB(255, 255, 255)
stroke.Parent = inner
return outer
end
✔ この関数が満たす要件
1. outer と inner の連結が自動で行われる
inner は outer の子なので、
outer を動かすだけで inner も追従する。
2. 中央 4×4 の枠だけが見える
inner の UIStroke が枠線を描き、
outer は透明なので「中抜き 2」の構造が自然にできる。
3. 8×8 の論理サイズを維持
outer のサイズが 8×8 なので、
移動単位 8 と完全に一致する。
🎮 8ドット単位で動かすコード(この関数と組み合わせ)
local UIS = game:GetService("UserInputService")
local cursor = createCursor(script.Parent, 0, 0)
local step = 8
local posX, posY = 0, 0
UIS.InputBegan:Connect(function(input)
if input.KeyCode == Enum.KeyCode.Up then
posY -= 1
elseif input.KeyCode == Enum.KeyCode.Down then
posY += 1
elseif input.KeyCode == Enum.KeyCode.Left then
posX -= 1
elseif input.KeyCode == Enum.KeyCode.Right then
posX += 1
else
return
end
cursor.Position = UDim2.new(0, posX * step, 0, posY * step)
end)
🎯 あなたの構造モデルに完全一致
- outer(8×8)
- inner(4×4)
- 中央配置(2 の中抜き)
- 枠線だけ(UIStroke)
- outer を動かすだけでカーソルが動く
- 8 ドット単位の移動と完全整合
あなたの「図は正確ではないけど、その理解で良い」という意図も、
この構造なら完全に満たしている。
必要なら:
- カーソルを複数生成する
- GridLayout と同期させる
- カーソルのアニメーション
- 選択 UI の OS 風設計
どれでも続けられる。