Start typing to search packages!
hueless
By @hakochanjp
Roblox
MirroredHueless
メッシュのテクスチャを実行時にグレースケール化し、あとから色をフェードで戻すための Roblox モジュール。
「最初は色のない世界で、プレイヤーが通ったところから色が戻る」といった演出のために作りました。
インストール
[dependencies]
Hueless = "hakochanjp/hueless@0.1.0"
wally install
使い方
入口は new だけです。
簡易
local Hueless = require(ReplicatedStorage.Packages.Hueless)
local hueless = Hueless.new()
hueless:Preload(workspace.PlantField) -- Part / Model / Folder / 配列
hueless:Desaturate(workspace.PlantField) -- 全部グレーになる
hueless:Trail(workspace.PlantField, humanoidRootPart) -- 近づいた株から色が戻る
微調整
local hueless = Hueless.new({
Resolution = 256,
FadeTime = 1.2,
EasingStyle = Enum.EasingStyle.Sine,
EasingDirection = Enum.EasingDirection.Out,
Strength = 0.85,
Luma = Hueless.Luma.BT709,
MaxConcurrent = 3,
OverlayScale = 1.02,
IdAttribute = "PlantId",
})
hueless:Restore(part, { FadeTime = 2 })
hueless:RestoreInstant(part)
print(hueless:IsDesaturated(part))
local trail = hueless:Trail(parts, root, { Radius = 8, Interval = 0.08 })
trail:Stop()
hueless:Destroy()
API
| メソッド | 説明 |
|---|---|
Hueless.new(options?) | 唯一の入口 |
:Preload(target) | グレー画像を先に作る。戻り値は用意できた種類数 |
:Desaturate(target) | グレーにする |
:Restore(target, fadeOptions?) | 色をフェードで戻す |
:RestoreInstant(target) | フェードなしで即座に戻す |
:IsDesaturated(part) | グレー状態か |
:SetTexture(part, textureId) | SurfaceAppearance 付きメッシュのテクスチャ ID を教える |
:Trail(target, follow, options?) | follow に近づいた Part から順に戻す |
:Destroy() | すべて片付ける |
target は Part 単体でも Model / Folder でも、それらの配列でも受け付けます。
オプション
| 名前 | 既定値 | 説明 |
|---|---|---|
Resolution | 256 | グレー画像の一辺。メモリ直結 |
FadeTime | 0.6 | 色が戻るのにかける秒数 |
EasingStyle | Quad | |
EasingDirection | Out | |
Strength | 1 | 0 = 元のまま、1 = 完全にグレー |
Luma | BT601 | BT601 / BT709 / Average / 自作関数 |
MaxConcurrent | 3 | 元画像を同時に何枚まで抱えるか |
Retries | 3 | 読み込み失敗時の再試行回数 |
OverlayScale | 1.02 | 重ねるコピーの拡大率 |
IdAttribute | nil | 状態を属性の値で覚える |
TextureAttribute | nil | テクスチャ ID をこの名前の属性から読む(SurfaceAppearance 用) |
仕組み
色はライティングではなく テクスチャ画像そのもの を差し替えて変えています。
BasePart.Color は乗算のティントなので、灰色を掛けても暗くなるだけで彩度は落ちません。彩度を実際に抜くには EditableImage でピクセルを書き換える必要があります。
色を戻すときはテクスチャを Tween できないので、グレーのコピーを本体に被せ、そのコピーを薄くしていきます。下から本体のカラーが透けてくる形です。
注意点
Game Settings → Security → Allow Editable Image & Mesh API を ON にしてください。 OFF だと Preload が 0 を返します。
テクスチャの所有者を揃えてください。 体験の所有者(グループ所有ならそのグループ)と同じアカウントがアップロードしたアセットしか読み込めません。
クライアント側で実行してください。 EditableImage はレプリケートされません。
SurfaceAppearance 付きメッシュはテクスチャ ID を教えてください。 SurfaceAppearance.ColorMap は実クライアントでは 読み取りにも Plugin 権限が必要 で、ゲームスクリプトからは読めません(Edit モードやプラグインからは読めるので気づきにくい)。属性か SetTexture で ID を渡します。
-- 方法1: 属性で教える(ストリーミングに強い。推奨)
mesh:SetAttribute("HuelessTexture", "rbxassetid://...") -- サーバー側などで
local hueless = Hueless.new({ TextureAttribute = "HuelessTexture" })
-- 方法2: コードで直接教える
hueless:SetTexture(mesh, "rbxassetid://...")
なお SurfaceAppearance の AlphaMode が Overlay の場合、ColorMap のアルファは「透明度」ではないため、被せるグレーコピーにはアルファを 255 に潰した版を自動で使います。
Resolution はメモリに直結します。
256² = 0.25 MB
512² = 1.00 MB
1024² = 4.00 MB (テクスチャ 1 種類あたり)
EditableImage には通常のテクスチャとは別枠のメモリ上限があります。21 種類を 1024² で作ろうとして実際に上限に当たりました。上限に当たると error ではなく nil が返る ので気づきにくいです。
同じテクスチャを使うインスタンスは 1 枚を共有するので、1000 株置いてもグレー画像は種類数しか作られません。
開発(実機検証)
プロジェクトファイルは 2 つあります。
| ファイル | 用途 |
|---|---|
default.project.json | ライブラリ本体の定義(wally / sourcemap 用) |
serve.project.json | 検証プレースへの同期用。ReplicatedStorage.Packages.Hueless にマップする |
検証プレースで最新のソースを使うには:
rojo serve serve.project.json
を起動して、Studio の Rojo プラグインから Connect してください。既存の
ReplicatedStorage.Packages.Hueless は接続時にリポジトリの内容へ同期されます。
Test.server.lua は globIgnorePaths で同期から除外しています。
ReplicatedStorage / Packages 配下のほかのインスタンスには触りません。
ライセンス
MIT
Package Details
Install command (Click to copy)
Version
0.1.0
License
MIT
Safe for commercial use
The package archive does not include its license text; the license is declared in its manifest metadata.
Automated license review — not legal advice.
