見出し画像

【コピペで動くClusterScript】オブジェクトの表示・非表示を切り替える編 ~テンプレートアイテム付き~

はじめに

この記事ではClusterScriptでオブジェクトの表示・非表示を切り替えるためのコードをまとめます。作成環境はCluster Creator Kit v2.2.0です。

テンプレートアイテムのUnityPackageをダウンロードできます
ご自由にご活用ください。

コードの解説は別記事をご参照ください


サンプル1: ボタンでオブジェクトの表示非表示を切り替える

Hierarchy構成例

ScriptItem(空オブジェクト、ScriptableItemコンポーネントをつける)
┣ Interact(インタラクト用のボタン)
┗ Model(表示非表示を切り替える対象の子オブジェクト)

サンプルコード

// 子オブジェクトを取得
const subNode = $.subNode("子オブジェクト名");

// 静止物をインタラクトしたときの挙動を設定
$.onInteract(() => {
  // 保存されている状態を取得
  let active = $.state.active;
  // 状態が未定義の場合は、現在のアクティブ状態で初期化
  if (active == null) active = subNode.getEnabled();

  // アクティブ状態を反転
  active = !active;
  // アクティブ状態を設定(activeがtrueなら表示、falseなら非表示になる)
  subNode.setEnabled(active);
  // 状態を保存
  $.state.active = active;
});

サンプル2: オブジェクトを交互に表示非表示する

Hierarchy構成例

ScriptItem(空オブジェクト、ScriptableItemコンポーネントをつける)
┣ Model1(最初は表示)
┗ Model2(最初は非表示)

サンプルコード

// 子オブジェクトを取得
const subNode1 = $.subNode("子オブジェクト1名");
const subNode2 = $.subNode("子オブジェクト2名");

// 静止物をインタラクトしたときの挙動を設定
$.onInteract(() => {
  // 子オブジェクト1の現在の有効状態を取得
  let active1 = subNode1.getEnabled();
  // 子オブジェクト2の現在の有効状態を取得
  let active2 = subNode2.getEnabled();

  // アクティブ状態を更新
  if (active1) {
    active1 = false;
    active2 = true;
  } else {
    active1 = true;
    active2 = false;
  }
  // アクティブ状態を設定(activeがtrueなら表示、falseなら非表示になる)
  subNode1.setEnabled(active1);
  subNode2.setEnabled(active2);
  // 状態を保存
  $.state.active1 = active1;
  $.state.active2 = active2;
});

サンプル3:インタラクトで非表示になった5秒後に再表示される

Hierarchy構成例

ScriptItem(空オブジェクト、ScriptableItemコンポーネントをつける)
┗ Model(表示非表示の対象となるオブジェクト)

サンプルコード

// 子オブジェクトを取得
const subNode = $.subNode("子オブジェクト名");

// 静止物をインタラクトしたときの挙動を設定
$.onInteract(() => {
  // アクティブ状態を非表示にする
  subNode.setEnabled(false);

  // 5秒後に表示させる
  $.state.time = ($.state.time ?? 0) + 5;
});

// 更新時の挙動を設定
$.onUpdate((deltaTime) => {
  $.state.time = ($.state.time ?? 0) - deltaTime;
  if ($.state.time <= 0) {
    // アクティブ状態を表示にする
    subNode.setEnabled(true);
    // 残り時間をリセット
    $.state.time = 0;
  }
});

サンプル4:インタラクトで表示した5秒後に非表示に戻る

Hierarchy構成例

ScriptItem(空オブジェクト、ScriptableItemコンポーネントをつける)
┣ Interact(インタラクト用のボタン)
┗ Model(最初は非表示。インタラクトで5秒間のみ表示される対象)

サンプルコード

// 子オブジェクトを取得
const subNode = $.subNode("子オブジェクト名");

// 静止物をインタラクトしたときの挙動を設定
$.onInteract(() => {
  // 残り時間をリセット
  $.state.time = 0;

  // アクティブ状態を表示にする
  subNode.setEnabled(true);

  // 5秒後に非表示にする
  $.state.time = ($.state.time ?? 0) + 5;
});

// 更新時の挙動を設定
  $.onUpdate((deltaTime) => {
  $.state.time = ($.state.time ?? 0) - deltaTime;
  if ($.state.time <= 0) {
    // アクティブ状態を非表示にする
    subNode.setEnabled(false);
    // 残り時間をリセット
    $.state.time = 0;
  }
});

サンプル5:6個の子オブジェクトから1個をランダムに表示する

Hierarchy構成例

ScriptItem(空オブジェクト、ScriptableItemコンポーネントをつける)
┣ Interact(インタラクト用のボタン)
┣ Model0(ランダム表示対象の子オブジェクト)
┣ Model1(ランダム表示対象の子オブジェクト)
┣ Model2(ランダム表示対象の子オブジェクト)
┣ Model3(ランダム表示対象の子オブジェクト)
┣ Model4(ランダム表示対象の子オブジェクト)
┗ Model5(ランダム表示対象の子オブジェクト)

サンプルコード

// 子オブジェクトを配列に入れる
const subNodes = [
  $.subNode("子オブジェクト0名"),
  $.subNode("子オブジェクト1名"),
  $.subNode("子オブジェクト2名"),
  $.subNode("子オブジェクト3名"),
  $.subNode("子オブジェクト4名"),
  $.subNode("子オブジェクト5名"),
];

// 静止物をインタラクトしたときの挙動を設定
$.onInteract(() => {
  // 全ての子オブジェクトを非表示にする
  for (const subNode of subNodes) {
    subNode.setEnabled(false);
  }

  // ランダムに1つの子オブジェクトを表示状態にする
  const index = Math.floor(Math.random() * 6); // 0〜5のランダムな数字を生成
  subNodes[index].setEnabled(true);
});

応用:切り替わりが分かりにくいので、表示前に0.5秒間の間を置く

// 子オブジェクトを配列に入れる
// ※同じなので省略

// 静止物をインタラクトしたときの挙動を設定
$.onInteract(() => {
  // 全ての子オブジェクトを非表示にする
  for (const subNode of subNodes) {
    subNode.setEnabled(false);
  }
  // 0.5秒間の間を置く
  $.state.waitForShow = 0.5;
});
  
$.onUpdate((deltaTime) => {
  // 表示待ち中の処理
  if ($.state.waitForShow > 0) {
  $.state.waitForShow -= deltaTime;
    if ($.state.waitForShow <= 0) {
    // ランダムに1つの子オブジェクトを表示状態にする
    const index = Math.floor(Math.random() * 6); // 0〜5のランダムな数字を生成
    subNodes[index].setEnabled(true);
    }
  }
});

応用:表示後のインタラクトで初期状態(全て非表示)に戻る

// 子オブジェクトを配列に入れる
// ※同じなので省略

// 静止物をインタラクトしたときの挙動を設定
$.onInteract(() => {
  // 子オブジェクトの状態を取得する
  const states = subNodes.map(subNode => subNode.getEnabled());
  // 全ての子オブジェクトが非表示状態であればランダムで1つ表示する
  if (states.every(state => !state)) {
    const index = Math.floor(Math.random() * 6); // 0〜5のランダムな数字を生成
    subNodes[index].setEnabled(true);
  } else {
  // それ以外は全てを非表示にする
  for (const subNode of subNodes) {
    subNode.setEnabled(false);
  }
  }
});

サンプル6:指定した秒数で表示非表示を繰り返す

Hierarchy構成例

ScriptItem(空オブジェクト、ScriptableItemコンポーネントをつける)
┗ Model(表示非表示を繰り返す子オブジェクト)

サンプルコード

// 子オブジェクトを取得
const subNode = $.subNode("子オブジェクト名");
// 表示状態を反転する間隔(秒)
const interval = 1;

$.onUpdate(deltaTime => {
  // 初期化処理
  if ($.state.time == null) {
    $.state.time = interval;
  }

  // 残り時間を更新
  $.state.time -= deltaTime;

  // 残り時間が0以下になったら、表示状態を反転する
  if ($.state.time <= 0) {
    subNode.setEnabled(!subNode.getEnabled());
    $.state.time = interval;
  }
});

応用:複数のオブジェクトを順番に表示する

// 子オブジェクトを取得
const subNode1 = $.subNode("子オブジェクト1名");
const subNode2 = $.subNode("子オブジェクト2名");
const subNode3 = $.subNode("子オブジェクト3名");

// (中略)

  // 残り時間が0以下になったら、表示状態を反転する
  if ($.state.time <= 0) {
    // 子オブジェクト1が表示状態の場合
    if (subNode1.getEnabled()) {
      subNode1.setEnabled(false); // 非表示にする
      subNode2.setEnabled(true); // 表示する
      $.state.time = interval; // 残り時間をリセット
    }
    // 子オブジェクト2が表示状態の場合
    if (subNode2.getEnabled()) {
      subNode2.setEnabled(false); // 非表示にする
      subNode3.setEnabled(true); // 表示する
      $.state.time = interval; // 残り時間をリセット
    }
    // 子オブジェクト3が表示状態の場合
    if (subNode3.getEnabled()) {
      subNode3.setEnabled(false); // 非表示にする
      subNode1.setEnabled(true); // 表示する
      $.state.time = interval; // 残り時間をリセット
    }
  }
});



最後に

はじめにも書きましたが、ここに書かれたコードは自由にご活用ください。全ては人類の創造力を加速するためです。

今後も少しずつ増やしていくので、たまに更新されているかチェックしに来てください。

それではみなさん、良きバーチャルライフを。
最終更新:2022/12/25 Mikko Hietalahti


この記事が気に入ったらサポートをしてみませんか?