見出し画像

左右に動くオブジェクトでつまづいたポイント(備忘録 その6)

スクリプトアイテムを実装時につまづいたポイントを備忘録として記録しております。前回は上下にオブジェクトを動かすスクリプトを試してみました。

前回の方法は「Scriptabile Item」と「Movable Item」をつけることで、シンプルなスクリプトで上下、左右、前後に動かすことができます。今回は公式の記事で紹介されている別のスクリプト事例を試してみます。

左右に動くオブジェクトをつくる

上記の記事の「移動する床」のスクリプト事例を参考に、座って乗れるオブジェクトを作ります。

こんな感じのオブジェクトを用意しました

前回のスクリプトはオブジェクト全体を動かすことはできますが、構成するオブジェクトの一部だけ動かすことはできません。
今回は下のシリンダー(台座)を固定して、上のシリンダーのみを動かしたいと思います。さらに座れるように設定してきます。

座るギミックの設定方法

公式の以下の記事を参考に座れるようにします。

オブジェクトの設定方法

空のオブジェクト(名称:浮遊物体)に「Item」「Scriptable Item」「Ridable Item」をつけます。今回は空のオブジェクト「ピボット位置変更」をスクリプトで動かしていくので、これにシリンダーと「sitPosition」を子オブジェクトとしてつけます。設定方法は下記の記事を参照ください。

使用するスクリプトは以下の通りです。const period は移動にかける時間。const widthは移動距離を指定しています。

const tile = $.subNode("ピボット位置変更");
const period = 3;
const width = 2;

const trapezoidalWave = (t) => {
  if (t < 0.25) {
    return t * 4;
  } else 
  if (t < 0.5) {
    return 1;
  } else
  if (t < 0.75) {
    return 3 - t * 4;
  } else {
    return 0;
  }
};

$.onUpdate(deltaTime => {
  let time = $.state.time ?? 0;
  time += deltaTime;
  $.state.time = time;
  const pos = new Vector3(
    trapezoidalWave(time % period / period) * width - width / 2, 
    0, 
    0);
  tile.setPosition(pos);
});
上のシリンダーに座りながら移動できます

失敗例

以下のように「sitPositon」を設定してしまうと、移動するオブジェクトに「sitPosition」が追随しないです。

失敗例
シリンダーは動くけど、座る位置は動かない

※逆に「sitPosition」をスクリプトで動かすと、アバターの座る位置だけ動かすこともできます。

改変してみる

スクリプト後半にある以下の部分は
new Vector3(X ,Y ,Z )でX軸、Y軸、Z軸の移動方向を指定しています。ここを差し替えることで移動する方向を変えることができます。

①横方向(X軸方向)に動かす場合(改変前)

 const pos = new Vector3(
    trapezoidalWave(time % period / period) * width - width / 2, 
    0, 
    0);

②縦方向(Y軸方向)に動かす場合

 const pos = new Vector3(
    0,
    trapezoidalWave(time % period / period) * width - width / 2, 
    0);
縦方向に上下するようになります

③前後方向(Z軸方向)に動かす場合

 const pos = new Vector3(
    0,
    0,
    trapezoidalWave(time % period / period) * width - width / 2);
前後に動くようになります

スクリプトでいろいろオブジェクトを動かしてみましょう。
お試しあれ!


次回は折りたたみ式階段をつくる!


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