秒数設定でなんかする系の簡単なサンプル


 私なりの秒数でなんかする感じの、スクリプトアイテム用の簡単なサンプルコードになります。基本はコードのconst宣言部分の、オブジェクト名と数値を変更すれば動きます(のはずです。動かなかったらごめんなさい)。
 あと「ここから」「ここまで」の部分の処理を書き換えれば、もうちょっと動きは変えられるかなと思います。
 使う場合、コメントアウト「//」の日本語の部分は消して使ってください。またサンプルコードは、修正する場合があります。 


※ このコードはご自由に使って問題ないです。
※ ただし、不具合や何らかの問題が発生した場合でも一切の責任は負いません。



1. ○○したら、xx秒間なんかする系

 1-1 インタラクトしたら、××秒間回転するオブジェクト

const obj = $.subNode("オブジェクト名");   // 対象のオブジェクト名を書く

const second = 5;                         // 秒数を書く
const v3 = new Vector3(1, 0, 0);          // 回転軸を書く(0,1,0)とか(0,0,1)

const angle = 360;                       // 角度を書く (半回転なら180)
const count = 5;                          // 回転回数を書く 
const rotate = 1;                         // 1か-1を書く (1なら右回転。-1なら左回転)

$.onInteract(() => {
    if (!$.state.flg) {
        $.state.flg = true;     
    }
});

$.onUpdate(deltaTime => {
   
    if(!$.state.init){
        $.state.originRot = obj.getRotation();
        $.state.init = true
    }

    if (!$.state.flg) {
        return;
    }

    let time = ($.state.time ?? 0) + deltaTime;
    $.state.time = time;

    if (time < second) {
        // ここから 回転する処理                       
        obj.setRotation(
            new Quaternion().setFromAxisAngle(
                v3,
                ((time % second / second) * angle * count * rotate) % angle
            )
        );
        // ここまで 回転する処理

    } else {
     // ここから 初期状態の回転位置にもどす
        obj.setRotation($.state.originRot);
        // ここまで  初期状態の回転位置にもどす
        $.state.time = 0;
        $.state.flg = false;
    }
});

 【修正 2023/1/31】
・angle変更でも360度回転するときあったので修正(間違ってました、ごめんなさい) 

1-2 もてるアイテムの「使う」をしたら、××秒間回転するオブジェクト

 ※ オブジェクトにはGrabbableコンポーネントをつけておく

const obj = $.subNode("オブジェクト名");       // オブジェクト名

const second = 5;                            // 秒数を書く
const v3 = new Vector3(1, 0, 0);             // 回転軸を書く(0,1,0)とか(0,0,1)

const angle = 360;                           // 角度を書く (半回転なら180)
const count = 5;                             // 回転回数を書く 
const rotate = 1;                            // 1か-1を書く (1なら右回転。-1なら左回転)


$.onUse(isDown => {
    if(isDown){
        $.state.flg = isDown;
    }
});

$.onUpdate(deltaTime => {
    if(!$.state.init) {
        $.state.originPos = obj.getRotation();
        $.state.init = true;
    }

    if (!$.state.flg) {
        return;
    }

    let time = ($.state.time ?? 0) + deltaTime;
    $.state.time = time;

    if (time < second) {
        // ここから 回転する処理
        obj.setRotation(
            new Quaternion().setFromAxisAngle(
                v3,
                ( (time % second / second) * angle * count * rotate ) % angle
            )
        );
        // ここまで

    } else {
        // ここから 回転したオブジェクトを初期位置に状態をもどす
        obj.setRotation($.state.originPos);
        // ここまで
        $.state.time = 0;
        $.state.flg = false;
    }
});

 【修正 2023/1/31】
・getPosition→getRotationに修正
・angle変更でも360度回転するときあったので修正(間違ってました、ごめんなさい)

2. 〇〇して××秒経過したら、なんかする系

2-1. インタラクトで移動して、xx秒経過したら元の位置に戻るオブジェクト

const obj = $.subNode("オブジェクト名");       // オブジェクト名を書く

const waitTime = 5;                         // 待機時間を書く
const v3 = new Vector3(1, 0, 0);       // 移動する座標を書く(3,0,0)とか(0,4,0)

$.onInteract(() => {
    if (!$.state.flg) {
        // ここから 移動する処理
        obj.setPosition(v3);
        // ここまで

        $.state.flg = true;
    }
});

$.onUpdate(deltaTime => {
    if(!$.state.init) {
        $.state.originPos = obj.getPosition();
        $.state.init = true;
    }

    if (!$.state.flg) {
        return;
    }

    let time = ($.state.time ?? 0) + deltaTime;
    $.state.time = time;

    if (time > waitTime) {
        // ここから オブジェクトを元の位置にもどす処理 
        obj.setPosition($.state.originPos);
     // ここまで

        $.state.time = 0;
        $.state.flg = false;
    }
});


3. xx秒おきに、なんかする系

3-1. 5秒ごとに、表示非表示を繰り返すオブジェクト

const obj = $.subNode("オブジェクト名");   // オブジェクト名を書く

const interval = 5;                      // 秒数を書く

$.onUpdate(deltaTime => {
    if(!$.state.init) {
        $.state.time = 0;
        $.state.init = true;
    }

    let time = $.state.time + deltaTime;
    $.state.time = time;

    if (time < interval) {
        return;
    }

    obj.setEnabled(!obj.getEnabled());
    $.state.time -= interval;
});

【修正 2023/1/31】

3-2. 5秒ごとに、スピードと回転方向が逆になる回転するオブジェクト

const obj = $.subNode("オブジェクト名");   // オブジェクト名

const interval = 5;                      // 秒数を書く

const speed1 = 1;                        // 数値を書く(速度のパラメタ)
const speed2 = 2;                        // 数値を書く(速度のパラメタ)

const v3 = new  Vector3(1,0,0);          // 回転軸を書く(0,1,0)とか(0,0,1)とか
const angle = 360;

$.onUpdate(deltaTime => {
    if(!$.state.init) {
        $.state.time = 0;
        $.state.rotate = 1;
        $.state.speed = speed1;
        $.state.init = true;
    }

    let time = $.state.time + deltaTime;
    $.state.time = time;
 
    // ここから 回転する処理
    obj.setRotation(
        new Quaternion().setFromAxisAngle(
            v3,
            (time % interval / interval) * angle * $.state.speed * $.state.rotate
        )
    );
    // ここまで 

    if (interval < time) {
        $.state.time -= interval;

        // ここから 逆回転・スピードの変更設定をする処理
        $.state.rotate = -$.state.rotate;
        $.state.speed = ($.state.speed == speed1) ? speed2 : speed1;
        // ここまで
    }
});


4. 「xx秒間は○○を、△△秒間は□□をする」を繰り返す系

4-1. 1秒間は表示、2秒間は非表示を繰り返す

const obj = $.subNode("オブジェクト名");     // オブジェクト名

const intervalArr = [1, 2];                // 数値をかく [表示時間, 非表示時間](最後の数字に , は入れない)

$.onUpdate(deltaTime => {
    if (!$.state.init) {
        $.state.time = 0;
        $.state.intervalIndex = 0;
        $.state.init = true;
    }

    let time = $.state.time + deltaTime;
    $.state.time = time;

    let index = $.state.intervalIndex;
    if (time < intervalArr[index]) {
        return;
    }
    // ここから  オブジェクトの表示/非表示の処理
    obj.setEnabled(!obj.getEnabled());
    // ここまで

    $.state.intervalIndex = (index == intervalArr.length - 1 ? 0 : ++index);
    $.state.time = 0;
});

 3-1を発展した感じです。intervalArrに「[1,2,xx,xx]」みたいに数値を追加して調整すれば、アニメーションっぽい表示ができるかもです。

4-2. 「5秒間かけて4m左に横移動、1秒間は待機、2秒間かけて4m右に横移動、3秒間は待機」を繰り返す

const obj = $.subNode("オブジェクト名");    // オブジェクト名をかく

const intervalArr = [[5, 1], [2, 3]];    // 秒数をかく。 [移動時間、待機時間]

const v3 = new Vector3(1, 0, 0);       // 移動する方向をかく (0,1,0)とか(0,0,1)
const range = 4;                           // 移動する距離をかく

$.onUpdate(deltaTime => {
    if (!$.state.init) {
        $.state.time = 0;
        $.state.intervalIndex = 0;
        $.state.init = true;
    }

    let time = $.state.time + deltaTime;
    $.state.time = time;

    let index = $.state.intervalIndex;
    if (time < intervalArr[index][0]) {

        // ここから  横移動する処理
        let dist = (time % intervalArr[index][0] / intervalArr[index][0]);
     
        obj.setPosition(
            v3.clone().multiplyScalar(
                (index % 2 ? 1 - dist : dist) * range
            )
        );
        // ここまで

        return;

    }
    time -= intervalArr[index][0];

    if (time < intervalArr[index][1]) {

     // ここから  待機する処理(念のため、ここでもsetPositionを設定)
        obj.setPosition(
            v3.clone().multiplyScalar(
                index % 2 ? 0 : range
            )
        );
        // ここまで

        return;
    }

    $.state.intervalIndex = (index == intervalArr.length - 1 ? 0 : ++index);
    $.state.time = 0;
}); 

  これを上下移動にして時間を調整すれば、スーパーマ○オのどっすん(正式名称は知らんけど)みたいな動きっぽくはできるんじゃないかと思います。


参考 


#ClusterScript


いいなと思ったら応援しよう!