$shibayu36->blog;

クラスター株式会社のソフトウェアエンジニアです。エンジニアリングや読書などについて書いています。

【cluster】スイッチで風景とスクリーンを出しわけする

clusterの推しアバター展示場で作業配信をすることがありスクリーンを設置しているのですが、初めからスクリーンが出ているのは展示場としては不恰好で嫌だなと思っていました。

そこで最初は風景が出ているけどスイッチを押すとスクリーンが出るようにしてみました。対応したワールドは以下のリンクから入れるので、良ければ入ってみてください。

cluster.mu

どうなったか

このように最初は風景として木があるだけだが、スイッチを押すと元々の木がなくなりスクリーンと椅子が出てくるようになりました。

やり方

以下を参考にしました。

基本は「オブジェクト・照明を出したり消したりするスイッチ」を参考にしつつ、元々は風景を表示しておくという部分が違ったので少し改変をしました。構成を図に書くとこういう感じです。

Switchを押すとWhenActiveとWhenInactiveが入れ替わるサンプルをunitypackageとしてGoogle Driveにあげてみたのでよければ参考にしてください。以下のunitypackageではスイッチを押すごとにキューブとスフィアが入れ替わるようになっています。 https://drive.google.com/file/d/1wgxgkCNy2JPLm0u4drE5eJ9UZ9qduatC/view?usp=sharing

Unity Editorで子オブジェクトでもWorld Positionをインスペクタで表示したい

Unity Editorで子オブジェクトにするとインスペクタ上でLocal Positionしか出なくなってしまう。World Positionだけをコンポーネントとしてコピーする方法もあるのだけど、他のオブジェクトをこのオブジェクトとX軸だけ合わせたいんだよな〜と思った時には難しい。

そのためインスペクタ上でWorld Positionも一緒に表示したいと思い調べてみると、Unityで親子関係のある子オブジェクトのワールド座標(絶対座標、外部座標)をインスペクタに表示する方法 - 結果だけでなく過程も見てくださいというめちゃくちゃ便利なやつを見つけた!これを導入することでUnity Editor上でこんな感じになる。

上の記事を参考にし、少しシンプルにしたものを置いておく。自分のプロジェクトのAssets/Editor/WorldPositionInspector.cs に置いてRefreshすればできるはず。

using UnityEditor;
using UnityEngine;

[CustomEditor(typeof(Transform))]
public class WorldPositionInspector : Editor
{
    public override void OnInspectorGUI()
    {
        base.OnInspectorGUI();

        Transform transform = (Transform)target;
        EditorGUILayout.Space();
        EditorGUILayout.Vector3Field("World Position", transform.position);
    }
}

はじめてのライトベイク挑戦 - clusterの推しアバター展示場のライトを調整しました

自分の推しアバター展示場の部屋の隅が暗くて悲しいなーと思っていた。そこでライトのことを学習して、はじめてのライトベイクに挑戦をしてみた。

対応したワールドは以下のリンクから入れるので、良ければ入ってみてください。

cluster.mu

before / after

調整前の様子。部屋の場所によっては次の画像のように暗くなっていてアバター展示として申し訳なかった。

調整後の様子。どのアバター展示も同じようにライトが当たるようになったので、部屋の場所によらずよく見えるようになった。

やっていったこと

まずライトについては以下の資料を参考にさせてもらった。今回はライトがclusterの制限の2を超えてしまうためライトベイクの記事がとくに参考になった。

次の手順で対応していった。

  • 部屋のオブジェクトについて、全選択してStaticの状態にする
  • 展示場所にライトを配置し、自分で作成したDisplaySet prefabの中に入れて全反映
  • Point LightをBakedに変更する
  • Progressive GPUでライトベイク

部屋のオブジェクトについて、全選択してStaticの状態にする

ライトベイクしたいオブジェクトを全て選択してStaticの状態にしていく。これは先に選択してStaticのチェックボックスをONにすれば良いだけだ。

展示場所にライトを配置し、自分で作成したDisplaySet prefabの中に入れて全反映

アバター展示ごとにPoint Lightを設置したい。アバター展示はDisplaySetという名前でprefab化しておいたので、

  • まず1つのアバター展示を選んでPoint Lightを設置し調整
  • 良さそうになったらprefabの中にライトを入れて全反映

という流れで行った。

まずこんな感じでライトを設置し、ライトの場所や設定を調整する。

その後Apply to Prefabをすれば一気に反映できた。

最終的な様子。各展示ごとにライトが設置できた。

Point LightをBakedに変更する

Window > Rendering > Light Explorerで一括でライトのモードを変えられるので、Directional LightはMixedに、Point LightはBakedに変更する。

Progressive GPUでライトベイク

ここまででオブジェクト側のベイクの事前準備はできた。最後にWindow > Rendering > Lightingからライトベイクを実行する。今回はLightingの設定は変えずにProgressive GPUでGenerate Lightingした。

記事によるとProgressive CPUの方が品質が良いとのことであったが、2021.3.4f1バージョンだとApple silliconのMacに対応してなかった!Progressive GPUはPreview状態のようだが、仕方ないのでこちらで実施した。

ちなみにUnity EditorのCHANGELOGの検索をかけると、Progressive GPUがGAしたのは2023.2.0f1からのようだ。

まとめ

このような手順ではじめてのライトベイクに成功した。結果としてアバター展示の周りの壁もちゃんと明るくなり、少しアバター商品が見やすくなったんじゃないかなと思っている。