📚
マテリアルノードから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の Remap や InverseLerp に相当する処理です。
| 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で実装します。
ノードの思考プロセス:
- Time → 時間経過を取得
- Multiply → 速度を掛ける
- Frac → ループさせる
- 出力 → 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