📚

マテリアルノードからLua対応(UE5)

に公開

UE5マテリアルノード ⇔ Roblox Lua

ニッチかもしれませんが、UE5マテリアルノードとRoblox Luaのイメージを繋ぐ自分用のメモです
(AI活用)。

1. 基本演算 (Math)

マテリアルでよく使う計算ノードのLua対応版です。

UE5 ノード Roblox Lua 解説・注意点
Add (A+B) A + B 加算。明るさの追加や座標移動
Subtract (A-B) A - B 減算。差分の計算
Multiply (A×B) A * B 乗算。色の合成やマスク処理
Divide (A÷B) A / B 除算。強度の調整
OneMinus (1-x) 1 - x 反転。アルファマスクの反転で多用
Power math.pow(A, B) 累乗。コントラスト強調やイージング
Abs math.abs(x) 絶対値。波形を折り返す時に使用
Floor math.floor(x) 切り捨て。グリッドスナップ
Ceil math.ceil(x) 切り上げ
Round math.round(x) 四捨五入
Sign math.sign(x) 符号取得。-1, 0, 1 を返す
Fmod A % B 剰余。周期的な処理やループ処理に利用

2. 制限・ロジック (Clamp & Logic)

数値を制御したり、境界を作るためのノードです。

UE5 ノード Roblox Lua 解説・注意点
Clamp math.clamp(x, min, max) 範囲制限。数値を指定範囲内に収める
Saturate math.clamp(x, 0, 1) 0-1制限。色や透明度の計算最後に必須
Min math.min(A, B) 最小値。暗い方を採用 (Darken)
Max math.max(A, B) 最大値。明るい方を採用 (Lighten)
Step x >= edge and 1 or 0 2値化。境界線で0か1にくっきり分ける
SmoothStep 後述のカスタム関数参照 滑らかな2値化。標準関数がないため自作
If condition and A or B 条件分岐。Luaの三項演算子的な書き方

3. 時間・波形 (Time & Wave)

アニメーションの動力源となる「時間」の扱いです。

UE5 ノード Roblox Lua 解説・推奨パターン
Time workspace.DistributedGameTime ゲーム内経過時間。Timeノードに最も近い挙動
Sine math.sin(x) 正弦波。-1 ~ 1 の周期運動。点滅や浮遊
Cosine math.cos(x) 余弦波。Sineと90度ずれた波形
Frac x % 1 小数部分。0~0.99...のループに変換

波形のバリエーション

UIアニメーションでよく使う波形パターンです。

local time = workspace.DistributedGameTime

-- 基本の正弦波 (-1 ~ 1)
local sine = math.sin(time)

-- 0-1に正規化した正弦波(点滅に最適)
local sine01 = (math.sin(time) + 1) / 2

-- 三角波パターン1(1 → 0 → 1 の往復、1から開始)
-- time % 2 で 0-2 の範囲を繰り返し、-1 で -1~1 にずらし、
-- abs で折り返すことで三角波を生成
local triangle1 = math.abs((time % 2) - 1)

-- 三角波パターン2(0 → 1 → 0 の往復、0から開始)
local triangle2 = 1 - math.abs((time % 2) - 1)

-- ノコギリ波(0 → 1 へ直線上昇、即座に0へ)
local sawtooth = time % 1

4. 範囲変換 (Remap)

UE5の RemapInverseLerp に相当する処理です。

UE5 ノード Roblox Lua 解説
InverseLerp (x - A) / (B - A) A-B範囲を0-1に正規化
Remap 後述のカスタム関数参照 ある範囲を別の範囲に変換

5. 補間 (Lerp)

Robloxでは型によって書き方が異なります。

対象 Roblox Lua 解説
数値 (number) math.lerp(A, B, t) v656で追加された標準関数
色 (Color3) ColorA:Lerp(ColorB, t) 標準メソッドあり
座標 (Vector2/3) VecA:Lerp(VecB, t) 標準メソッドあり
位置 (UDim2) UDim2A:Lerp(UDim2B, t) UI座標用。標準メソッドあり
-- 数値の補間(v656以降)
local value = math.lerp(0, 100, 0.5)  -- 結果: 50

-- 色の補間
local color = Color3.new(1, 0, 0):Lerp(Color3.new(0, 0, 1), 0.5)

6. ベクトル・カラー (Vector & Color)

色や座標(UV)を操作する処理です。

UE5 ノード Roblox Lua 解説
AppendVector Vector2.new(x, y) 2つの数値をまとめて座標に
ComponentMask Vec.X / Color.R 特定成分だけを取り出す
Distance (A - B).Magnitude 2点間の距離
Normalize Vec.Unit 単位ベクトル化
Dot Vec1:Dot(Vec2) 内積。角度計算に使用
Cross Vec1:Cross(Vec2) 外積(Vector3のみ)

Roblox UIで使う主な型

用途
Color3 RGB色 Color3.new(1, 0, 0) — 赤
Color3.fromRGB() RGB (0-255) Color3.fromRGB(255, 0, 0) — 赤
Color3.fromHSV() HSV色空間 Color3.fromHSV(0, 1, 1) — 赤
Vector2 2D座標 Vector2.new(100, 50)
UDim2 UI座標 UDim2.new(0.5, 0, 0.5, 0) — 中央

【応用】カスタム関数

Luaの標準ライブラリにない便利なノード機能は、関数として定義します。

SmoothStep(滑らかなマスク)

UIのフェードイン・アウトに不可欠な関数です。

local function smoothStep(edge0, edge1, x)
    x = math.clamp((x - edge0) / (edge1 - edge0), 0, 1)
    -- エルミート補間(滑らかなS字カーブを作る数式)
    return x * x * (3 - 2 * x)
end

Lerp(数値用・v656より前のバージョン向け)

math.lerp が使えない古いバージョン用の代替関数です。

local function lerp(a, b, t)
    return a + (b - a) * t
end

Remap(範囲変換)

ある範囲を別の範囲に変換します。

local function remap(value, inMin, inMax, outMin, outMax)
    local t = (value - inMin) / (inMax - inMin)
    return outMin + (outMax - outMin) * t
end

-- 使用例: 0-100 を 0-1 に変換
local normalized = remap(75, 0, 100, 0, 1)  -- 結果: 0.75

PingPong(往復)

増加し続ける値を往復運動に変換します。

local function pingPong(t, length)
    t = t % (length * 2)
    return length - math.abs(t - length)
end

-- 使用例: 0→1→0→1... の繰り返し
local value = pingPong(time, 1)

【実践】Panner(テクスチャスクロール)

マテリアルの定番表現をRobloxで実装します。

ノードの思考プロセス:

  1. Time → 時間経過を取得
  2. Multiply → 速度を掛ける
  3. Frac → ループさせる
  4. 出力 → UV座標に適用
local RunService = game:GetService("RunService")
local img = script.Parent  -- ImageLabel

-- スクロール速度(1.0 = 1秒で1周)
local Speed = 0.5

RunService.PreRender:Connect(function()
    local time = workspace.DistributedGameTime
    local scrollX = (time * Speed) % 1
    
    -- ImageRectOffset: 画像のどの部分を表示するか(ピクセル単位の左上座標)
    -- ImageRectSize: 表示する領域のサイズ(ピクセル単位)
    -- これらを組み合わせることで、スプライトシートの一部を切り出したり、
    -- スクロールアニメーションを実現できる
    local textureWidth = img.ImageRectSize.X
    img.ImageRectOffset = Vector2.new(scrollX * textureWidth, 0)
end)

まとめ

やりたいこと UE5での方法 Robloxでの方法
時間でアニメーション Time ノード workspace.DistributedGameTime
滑らかな変化 Lerp / SmoothStep math.lerp() (v656+) / 自作関数
周期的な動き Sine / Cosine math.sin / math.cos
ループ Frac x % 1
範囲変換 Remap 自作関数
色の補間 Lerp (Color) Color3:Lerp()

参考リンク

Discussion