Scriptable Itemでオブジェクトの表示・非表示を切り替えてみよう

Cluster Scriptに新しい機能が追加されました!
子オブジェクトの表示・非表示の状態を切り替えたり、取得することができるようになります。
今回はこちらの機能の使い方を紹介していきます。

追加されたメソッド

  • setEnabled
    • SubNodeの有効状態を変更します。 有効でないSubNodeとその全ての子のSubNodeは空間上で有効でなくなり、描画されず、当たり判定が無いものとして扱われます。
      有効状態はネットワークを介して同期されるため、即座に反映されない場合があることに留意してください。
  • getEnabled
    • SubNodeの現在の有効状態を取得します。
      setEnabledで指定された値ではなく、SubNodeの現在の有効状態が返されることに留意してください。
  • getTotalEnabled
    • SubNodeが空間上で有効かを取得します。 そのSubNodeと全ての親が有効である時にそのSubNodeは空間上で有効になります。
      setEnabledで指定された値ではなく、SubNodeの現在の有効状態が返されることに留意してください。

スクリプトの例

こちらで配布しているサンプルプロジェクトのアセットを使って、クリックすると消えるドアをつくります。

  • Assets/ClusterTutorial/Prefabs/1-1から、ドアのない穴のあいた壁を設置してください。
  • 続いてその壁をHierarchy上で展開し、DoorRootにドアのプレハブをドラッグアンドドロップして子オブジェクトにします。
  • ちょうど壁の穴にはまるようにドアが設置されます。
  • 壁を選択し、InspectorのAdd ComponentからScriptable Itemを追加しましょう。
  • Source Codeの欄に以下のスクリプトを入力します。

.jsファイルに保存してSource Code Asset欄に指定する方法でも構いません。

1行目の

Door-1

はHierarchy上のドアのオブジェクト名に合わせて、必要に応じて書き換えてください。

const door = $.subNode("Door-1"); // 子オブジェクトのドアを取得
 
$.onInteract(() => {
    let close = $.state.close;
    if(close == null) close = door.getEnabled(); // 初期化されていなければ、現在のアクティブ状態で初期化
 
    close = !close; // closeの値がtrueならfalseに、falseならtrueに変える
    door.setEnabled(close); // ドアのアクティブ状態を設定(closeがtrueなら表示、falseなら非表示になる)
    $.state.close = close; // closeの値を保存
});

アップロードして確かめてみましょう。壁をクリックするたびに、ドアが出たり消えたりします。

アイテム自身のアクティブ状態を切り替えることはできません。
$.subNodeで取得した子オブジェクトのアクティブ状態が変更できます。

今回の例ではクリックするたびにアクティブ状態を入れ替えましたが、応用すれば一定回数クリックすると開くドアや、特定の時間帯だけ現れるオブジェクトなどもつくることができます。

ソースコードを改変して、自分なりに工夫してみましょう!

記事をシェアしてワールド制作を盛り上げよう!