Forest Logo
search
package_2

hueless

By @hakochanjp

Roblox

Mirrored

Hueless

メッシュのテクスチャを実行時にグレースケール化し、あとから色をフェードで戻すための 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 でも、それらの配列でも受け付けます。

オプション

名前既定値説明
Resolution256グレー画像の一辺。メモリ直結
FadeTime0.6色が戻るのにかける秒数
EasingStyleQuad
EasingDirectionOut
Strength10 = 元のまま、1 = 完全にグレー
LumaBT601BT601 / BT709 / Average / 自作関数
MaxConcurrent3元画像を同時に何枚まで抱えるか
Retries3読み込み失敗時の再試行回数
OverlayScale1.02重ねるコピーの拡大率
IdAttributenil状態を属性の値で覚える
TextureAttributenilテクスチャ ID をこの名前の属性から読む(SurfaceAppearance 用)

仕組み

色はライティングではなく テクスチャ画像そのもの を差し替えて変えています。

BasePart.Color は乗算のティントなので、灰色を掛けても暗くなるだけで彩度は落ちません。彩度を実際に抜くには EditableImage でピクセルを書き換える必要があります。

色を戻すときはテクスチャを Tween できないので、グレーのコピーを本体に被せ、そのコピーを薄くしていきます。下から本体のカラーが透けてくる形です。

注意点

Game Settings → Security → Allow Editable Image & Mesh API を ON にしてください。 OFF だと Preload0 を返します。

テクスチャの所有者を揃えてください。 体験の所有者(グループ所有ならそのグループ)と同じアカウントがアップロードしたアセットしか読み込めません。

クライアント側で実行してください。 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 の AlphaModeOverlay の場合、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.luaglobIgnorePaths で同期から除外しています。 ReplicatedStorage / Packages 配下のほかのインスタンスには触りません。

ライセンス

MIT

Package Details

Install command (Click to copy)


Version

0.1.0

License

MIT

check_circle

Safe for commercial use

infoThe package archive does not include its license text; the license is declared in its manifest metadata.

Automated license review — not legal advice.