🕰️

clusterのItemTimerをスクリプトで書くと?

2023/05/30に公開

clusterのItemTimerよりスクリプトでは高機能な時間の判定ができますが、初心者の段階ではかえって混乱してしまうかもしれません。


基本的には「自分で時間を数えて、一定値を超えたら何か起こす」です。

実際の例

1つの例を示してみます。
これはクリックするたびに「0.5秒待ってから」Z方向に1移動するスクリプトをハコにつけた例です。


すぐに移動せず、ちょっと待ってから動く

この「0.5秒待ってから」がCCKでいうItemTimerの部分ですね。

スクリプト

実際のスクリプトはこんな感じです。
$.onUpdate と $.onInteract があるスクリプトはclusterスクリプトの定番ですね。

まあ、一度コピペで試してみてください。

//「定数」の情報
//ここを変えれば待ち時間や動く方向を変えられる
const timeLength = 0.5; //待つ時間
const moveVec = new Vector3(0,0,1); //動かす距離(Z方向に1)

//毎フレーム呼ばれる
$.onUpdate(deltaTime => { 
  //初期化
  if (!$.state.shokika) { 
    $.state.shokika = true; //初期化済であると記録
    $.state.clicked = false; //まだクリックはされてない(OFF状態)
    $.state.ichi = $.getPosition(); //初期位置記録
  }
  
  //さっきクリックされたか?(ONになったか?)
  if($.state.clicked) {
    $.state.time += deltaTime; //経過時間を数える
    
    //もしtimeLengthより長い時間が経過していたら
    if($.state.time >= timeLength) {
      $.state.ichi = $.state.ichi.add(moveVec); //位置データを移動
      $.setPosition($.state.ichi); //そのデータに基づき実際にモノを動かす
      
      $.state.clicked = false; //「クリックされた」をOFFにする
    }
  }
});

//クリックされたとき
$.onInteract(() => {
  $.state.clicked = true; //「クリックされた」をONにする
  $.state.time = 0.0; //経過時間をまず0秒に設定
});

参考になる記事

そもそもスクリプトをどうやってモノに貼り付けるかとかが分かりづらい場合、こちらのサンプルプロジェクトを活用した上で、
https://zenn.dev/vins/articles/20116ee7527587

私の書いた別の入門系記事を読んで頂くのが良いかなと思います。
https://zenn.dev/vins/articles/bde7676d1f54b4
https://zenn.dev/vins/articles/25eb3c8fc7d96c

deltaTimeの意味とかについても書いてありますよ。

Discussion