PlayerScriptでローカルギミック
PlayerScriptを用いて非同期に表示/非表示を切り替えるローカルギミックを作成する方法を解説します。
ざっくりとした仕組み
PlayerLocalUIをワールド設置、その中に置いたオブジェクトをPlayerScriptでON/OFFします。
実装手順
PlayerLocalUIをワールドに設置します。SafeAreaは不要なので削除します。
InspectorからCanvasのRenderModeをWorldSpaceに設定します。

そのままだと位置が変なのでTransformをリセット、Witdth、Heightも1に設定します。

次にローカルでON/OFFしたいオブジェクトをPlayerLocalUI以下に設置します。ここでは例としてLocalObjectというオブジェクトを設置しています。

ON/OFFを切り替えのためのボタンを作成します。
ここではToggleSwitchというEmptyオブジェクトにスイッチモデルとしてCubeを作成します。

Player Local Object Reference List コンポーネントをToggleSwitchに追加します。ローカルでON/OFFしたいオブジェクトをPlayer Local Object Referencesに追加します。

ToggleSwitchにScriptable ItemコンポーネントとPlayer Scriptコンポーネントを追加し、以下のスクリプトを設定します。
ItemScript
$.onInteract((player) => {
// インタラクトしたプレイヤーにPlayerScriptを設定
$.setPlayerScript(player);
});ToggleSwitchにインタラクトしたプレイヤーにPlayerScriptを設定します。
PlayerScript
const localObj = _.playerLocalObject("LocalObject"); // ローカルオブジェクトを取得
const enabled = localObj?.getEnabled(); // 表示状態を取得
localObj.setEnabled(!enabled); // 表示状態を反転$.setPlayerScript()が実行されると上記のPlayerScriptが実行されます。
Player Local Object Reference Listから"LocalObject"を取得します。
getEnabled()でLocalObjectの表示状態を取得、反転した値をsetEnabled()で設定します。
$.setPlayerScript()が呼ばれるたびに、トップレベルに書かれたコードが実行されるため、インタラクトのたびに、毎回同じコードが呼ばれON/OFFが切り替わります。
PlayerScriptにはstateがないため、getEnabledとsetEnabledを使ってON/OFFしています。

これで完成です。
LocalObject以下に任意のオブジェクトを入れれば、ローカルでON/OFFできます。
初期状態を非表示にするには
LocalObjectをUnityEditor上であらかじめ非表示にしておきます。
ローカルオブジェクトの制限
PlayerLocalObjectReferenceListの制限によりこちらの方式ではItemはON/OFFできません。(Itemを子に含む場合も同様)
サンプルパッケージ
サンプルパッケージはこちらのリンクからダウンロードできます。CC0です。
Triggerを使った方法
PlayerLocalUI内のオブジェクトならSetGameObjectActiveGimmickとPlayerTriggerを使ってのON/OFFもできます。
こちらはItemのON/OFFも可能です。
以前と違い、Constraintは不要、VRでもコライダーも有効になりました。


仕組み自体は昔書いたこちらの記事と一緒です。
スイッチを分けたい場合、オブジェクトごとにPlayerTriggerを用意する必要があります。
サンプルパッケージ
Trigger方式のサンプルパッケージはこちらのリンクからダウンロードできます。CC0です。
さいごに
PlayerScript等のアップデートにより、clusterのギミックはより柔軟になってきたと思います。機能が増えるたびに必要なメソッドや仕様を理解する必要がありますが、昔よりできることが増えてきたなーと思います。
