Mashiro Light Group

子階層の Light とビームライト(名前に BeamLight を含む MeshRenderer)を 1 グループとして扱い、明るさ・色・サイズ・回転を適用する UdonSharpBehaviour(MashiroLightGroup)と、灯体の回転対象を示すマーカー(MashiroLightFixture)、配置・確認用のエディタ拡張。MashiroLightGroup は制御側から Initialize が呼ばれるまで実行時にライトを変更しない。

構成

ファイル 役割
MashiroLightGroup.cs / .asset グループ内のライト・ビームライトへ明るさ・色・サイズ・回転を適用し、目標値を同期する
MashiroLightFixture.cs 回転対象の Transform を示す編集時マーカー(MonoBehaviour)
Editor/MashiroLightGroupEditor.cs MashiroLightGroup のカスタムインスペクタ(ライトサイズ・回転・影・カリングマスク・点灯テスト)、点灯テストの状態管理(MashiroLightGroupTestController)、エディタ上のビーム開き角の反映(MashiroBeamShapeRefresher)
Editor/MashiroLightFixtureEditor.cs MashiroLightFixture のカスタムインスペクタ
Editor/MashiroLightRotationBuildBaker.cs シーン処理時に回転データを MashiroLightGroup へ転記する
Editor/MashiroLightGroupWindow.cs シーン内の全 MashiroLightGroup を一覧・点灯テストするエディタウィンドウ

依存

仕様

MashiroLightGroup(実行時)

Initialize(int index)

  1. GetComponentsInChildren<Light>() で子階層の Light を取得する(非アクティブは含まない)。
  2. GetComponentsInChildren<MeshRenderer>() のうち、名前に BeamLight を含むものをビームライトとして取得する(非アクティブは含まない)。
  3. Light が 1 つ以上あれば、先頭の Light の spotAngle を基準サイズとする。
  4. サイズオフセット(A/B 含む)・パン・チルト・フェーダー値を 0、色(A/B・表示色含む)を initialColor にする。
  5. ApplyIntensityDirect(0) を実行する(全ライト・ビームの GameObject を非アクティブにする)。
  6. 色・サイズ・回転を適用する。

明るさ

色

サイズ

回転

系統 A/B・フェーダー値

同期受信(OnDeserialization)

マテリアル

MashiroLightFixture

ランタイム回転データの転記(MashiroLightRotationBuildBaker)

MashiroLightGroup インスペクタ

DrawDefaultInspector() の下に次のセクションを表示する。ライトサイズ・回転・影・カリングマスクの操作は Undo に記録する。スライダーは 1 回のドラッグを 1 つの Undo にまとめる。対象の Light / ビーム / Fixture は子階層から非アクティブを含めて取得する。

セクション コントロール 範囲 動作
ライトサイズ Size スライダー 1〜179 全 Spot ライトの spotAngle を設定し、ビームの開き角を反映する。ビームの Transform は変更しない
ライトサイズ Range スライダー 0〜200 全 Light の range を設定する。ビームは変更しない
ライトサイズ ビームの長さ (m) スライダー 0.1〜10 全ビームのワールドでの長さ(BeamMeshLength × Y 方向のワールドスケール)が指定値になるよう localScale.y を設定する。X / Z スケールは変更しない
ライトサイズ ビームの太さ補正 スライダー 0〜5 このグループの beamWidthMultiplier を設定する
ライトサイズ ビームの見た目係数 スライダー 0.3〜2 シーン内の全 MashiroLightGroup(非アクティブ含む)の beamAngleScale を同じ値に設定する
回転 横回転(パン) スライダー -90〜90 下記「回転セクション」参照
回転 縦回転(チルト) スライダー -90〜90 下記「回転セクション」参照
回転 現在の向きをデフォルトに保存 ボタン – 全 Fixture の現在の localRotation を基準姿勢として保存し、パン / チルト角を 0 にする
回転 デフォルトに戻す ボタン – 基準姿勢を記録済みの全 Fixture を基準姿勢へ戻し、パン / チルト角を 0 にする
影 影タイプ None / Hard / Soft 全 Light の shadows を設定する
影 影の濃さ スライダー 0〜1 全 Light の shadowStrength を設定する。影タイプ が None のとき非表示
カリングマスク 対象レイヤー 名前付きレイヤー 全 Light の cullingMask を設定する
点灯テスト テスト明るさ スライダー 0〜1 点灯テストの明るさ。点灯中は即時反映する
点灯テスト 点灯テスト / 点灯テスト中(クリックで OFF) ボタン – 点灯テストの開始 / 終了。点灯中は背景色 #E85900

エディタ上のビーム開き角(MashiroBeamShapeRefresher)

点灯テスト(MashiroLightGroupTestController)

MashiroLightFixture インスペクタ

ライトグループウィンドウ(MashiroLightGroupWindow)

領域 コントロール 動作
ツールバー 更新 ボタン 一覧を再取得する
ツールバー 照明グループ: n 件 グループ数を表示する
ツールバー 全点灯 ボタン 点灯テスト中でない全グループの点灯テストを開始する(明るさ = テスト明るさ × intensityMultiplier、色 = initialColor)
ツールバー 全消灯 ボタン 全グループの点灯テストを終了する
プレビュー タイル(76 × 48) 点灯テスト中は適用色 × 明るさ(intensityMultiplier で正規化し 0〜1 にクランプ)、それ以外は黒を表示する。グループ名を表示する。クリックでグループを選択して Ping する
照明グループ 色スウォッチ プレビュータイルと同じ色を表示する
照明グループ グループ名 クリックでグループを選択して Ping する
照明グループ 明るさスライダー(0〜1) テスト明るさを設定する。点灯中は即時反映する
照明グループ カラーフィールド initialColor を変更する(Undo 記録・CopyProxyToUdon・シーンを変更済みにする)。点灯中は即時反映する
照明グループ 点灯 / 点灯中 ボタン 点灯テストの開始 / 終了。点灯中は背景色 #E85900

Inspector

MashiroLightGroup

フィールド 型 既定値 必須 内容
initialColor Color (1, 1, 1, 1) – Initialize 時の色。点灯テストの色

次のフィールドはインスペクタに表示しない。

フィールド 型 既定値 内容
intensityMultiplier float(private、[SerializeField]) 1 明るさのゲイン
beamAngleScale float 1 ビームの見た目係数。インスペクタの ビームの見た目係数 で設定する
beamWidthMultiplier float 1 ビームの太さ補正。インスペクタの ビームの太さ補正 で設定する
lights Light[] なし Initialize 時に取得した Light
beamLights MeshRenderer[] なし Initialize 時に取得したビーム
rotationTargets Transform[] なし 回転対象(転記値)
rotationDefaults Quaternion[] なし 回転対象の基準 localRotation(転記値)
rotationAllowHorizontal bool[] なし パン許可(転記値)
rotationAllowVertical bool[] なし チルト許可(転記値)
rotationVerticalAxis Vector3[] なし チルト軸(転記値)

MashiroLightFixture

フィールド 型 既定値 必須 内容
allowHorizontal bool true – パン(ワールド上方向まわりの回転)を適用する
allowVertical bool true – チルトを適用する
verticalAxis Vector3 (1, 0, 0) – チルトの回転軸(このオブジェクトのローカル軸)

API リファレンス

MashiroLightGroup

UI へ手配線するものはない。すべて内部連携用(配線不要)。

シグネチャ 用途 呼び出し種別
void Initialize(int index) ライトを取得し、初期値を適用して制御を開始する 制御側コンポーネントが呼ぶ
void SetDeserializationListener(UdonSharpBehaviour listener) 同期受信時に OnLightGroupDeserialized を送る通知先を設定する 制御側コンポーネントが呼ぶ
void ApplyIntensityDirect(float intensity) 明るさをライトへ適用する(同期しない) 制御側コンポーネントが呼ぶ
void SetColorWithFade(Color newColor) 目標色を設定し、2 秒でフェードする 制御側コンポーネントが呼ぶ
void SetBankColor(bool isA, Color color) 系統 A / B の保持色を設定する 制御側コンポーネントが呼ぶ
Color GetBankColor(bool isA) 系統 A / B の保持色を返す 制御側コンポーネントが呼ぶ
void SetSizeOffset(float offset) サイズオフセットを ±30 にクランプして適用する 制御側コンポーネントが呼ぶ
float GetSizeOffset() サイズオフセットを返す 制御側コンポーネントが呼ぶ
void SetBankSizeOffset(bool isA, float offset) 系統 A / B の保持サイズオフセットを ±30 にクランプして設定する 制御側コンポーネントが呼ぶ
float GetBankSizeOffset(bool isA) 系統 A / B の保持サイズオフセットを返す 制御側コンポーネントが呼ぶ
float GetMaxSizeOffset() MaxSizeOffset(30)を返す 制御側コンポーネントが呼ぶ
void SetPan(float pan) パン角を ±30 にクランプして適用する 制御側コンポーネントが呼ぶ
void SetTilt(float tilt) チルト角を ±30 にクランプして適用する 制御側コンポーネントが呼ぶ
float GetPan() パン角を返す 制御側コンポーネントが呼ぶ
float GetTilt() チルト角を返す 制御側コンポーネントが呼ぶ
float GetMaxRotationAngle() MaxRotationAngle(30)を返す 制御側コンポーネントが呼ぶ
void UpdateFromSlider(float value, bool isSliderA) フェーダー A / B の値を設定する(ライトへは適用しない) 制御側コンポーネントが呼ぶ
float GetSliderAValue() フェーダー A の値を返す 制御側コンポーネントが呼ぶ
float GetSliderBValue() フェーダー B の値を返す 制御側コンポーネントが呼ぶ
void ResetToInitialValues() サイズオフセット・パン・チルトを 0、色を initialColor(フェード)にする 制御側コンポーネントが呼ぶ
string GetName() GameObject 名を返す 制御側コンポーネントが呼ぶ
float GetDisplayIntensity() 最後に ApplyIntensityDirect() へ渡した値を 0〜1 にクランプして返す 制御側コンポーネントが呼ぶ
Color GetDisplayColor() 表示中の色(フェード途中の値を含む)を返す 制御側コンポーネントが呼ぶ
float GetInitialSize() 基準サイズ(Initialize 時の先頭 Light の spotAngle)を返す 制御側コンポーネントが呼ぶ
int GetRealtimeLightCount() Initialize 時に取得した Light の数を返す 制御側コンポーネントが呼ぶ
bool AreLightsEnabled() 最後に適用した明るさ(× intensityMultiplier)が 0 より大きいかを返す 制御側コンポーネントが呼ぶ
void OnDeserialization() 色フェードの開始・サイズと回転の適用・通知先への送信 VRChat が呼ぶ(内部専用)
const string DeserializedEventName "OnLightGroupDeserialized" 定数
const float BeamMeshLength / BeamBaseSlope / BeamConeWidthSlope / MinBeamSlope / MaxBeamHalfAngle ビームの開き角の計算に使う定数(値は「固定値」を参照) 定数(エディタ拡張が参照する)

MashiroLightFixture

UI へ手配線するものはない。すべてエディタ拡張から呼ぶ内部連携用(配線不要)。メソッドは UNITY_EDITOR 時のみ定義する。

シグネチャ 用途 呼び出し種別
void SaveDefaultRotation() 現在の localRotation を基準姿勢として保存し、パン / チルト角を 0 にする エディタ拡張が呼ぶ
void EnsureDefaultRotation() 基準姿勢が未記録なら SaveDefaultRotation() を実行する エディタ拡張が呼ぶ
void RestoreDefaultRotation() 基準姿勢が記録済みなら localRotation を基準姿勢へ戻し、パン / チルト角を 0 にする エディタ拡張が呼ぶ
void SetPanTilt(float pan, float tilt) 適用したパン / チルト角を記録する エディタ拡張が呼ぶ
bool HasDefaultRotation { get; } 基準姿勢を記録済みか エディタ拡張が参照する
Quaternion DefaultRotation { get; } 基準姿勢(localRotation) エディタ拡張が参照する
float PanAngle { get; } 記録したパン角 エディタ拡張が参照する
float TiltAngle { get; } 記録したチルト角 エディタ拡張が参照する

MashiroLightGroupWindow(エディタ専用)

シグネチャ 用途 呼び出し種別
static void Open() ライトグループウィンドウを開く メニュー Tools/Mashiro Theater/Light Groups

ライセンス

MIT License(MashiroTheater-Utils 同梱の LICENSE.md を参照)。