見出し画像

公式scriptに3行追加してパルクールで遊ぶ方法

Cluster Creator #2 Advent
Calendar 2023 投稿記事

アニメーションで
アバターに動きを加えても
再生終了後
元の位置に戻されてしまいます。

もしそのタイミングで
アバターをワープさせることができたら
カッコ良く壁を駆け上がったり
華麗にビルの間を飛び越えたりする
アクションができるようになります。

この記事はメタバースで
スーパーヒーローになりたい皆様に向けて
発信しています(笑)

1 パルクール遊び

Clusterワールド内の壁や地形を利用して
登る・飛び移る・飛び込むなどの
アクロバティックなアクションを披露する遊び。

2 アニメーションの入手

Adobe 『Mixamo』から遊んでみたい
アクションのアニメーションを入手します。

ダウンロードは
Cluster公式のこちらの記事が参考になります。

上記記事内のLoop Timeのチェックは不要です。

3 インタラクトアイテムの準備

① Unity CCK

インタラクトアイテムは
CubeやSphereでOKです。

Unity画面

② アニメーションを仕込みます。

③ スクリプトを仕込みます。

Cluster公式のこちらの記事が参考になります。

この段階で動きを試しておくと楽しいですよ。

4 公式サンプルスクリプトの特徴

① インタラクト再生

インタラクトすると再生します。
視点を自由に動かせるので
動画撮影に向いています。

② アニメーションの自動終了

アニメーションを1回再生すると終了します。
ワンアクションの
アニメーション再生に向いています。
毎フレーム処理の負荷が少なくて済みます。

③ ダブルトリガー

公式サンプルスクリプトは
再生スタートと終了時に処理を発動する
ダブルトリガーを持っています。

5 パルクールダブルトリガー

① 再生スタートトリガー

パルクールアクションを開始する位置に
アバターを移動させその向きを固定します。
スクリプトは
setRotation』と『setPosition』を
使います。

player.setRotation(new Quaternion().setFromEulerAngles(new Vector3(0, 0, 0)));
player.setPosition(new Vector3(0,0,0));

setRotation』は、
真ん中のY軸『0』を任意の角度に
変更して使います。
setPosition』は、
Vector3の左からX,Y,Zの値を任意の座標に
変更して使います。

② 再生終了トリガー

パルクールアクションを終了する位置に
アバターを移動させます。
スクリプトは『setPosition』を使います。

player.setPosition(new Vector3(0,0,0));

setPosition』は、
Vector3の左からX,Y,Zの値を任意の座標に
変更して使います。

6 サンプルスクリプト

// アニメーションクリップを取得
const animation = $.humanoidAnimation("Animation1");


// アニメーションクリップの長さを取得
const animationLength = animation.getLength();


// アニメーション適用間隔を設定(プレイヤーへの操作の頻度制限)
const interval = 0.1;

// クリックしたときの処理
$.onInteract(player => {
    // 既にアニメーション再生中のプレイヤーがいる場合はリセット
    if ($.state.player) {
        $.state.player.setHumanoidPose(null);
    }


    // アニメーションの時間をリセット
    $.state.animationTime = 0;


    // クリックした人をアニメーションの対象にする
    $.state.player = player;

    // むさし追加
	player.setRotation(new Quaternion().setFromEulerAngles(new Vector3(0, 0, 0)));
	player.setPosition(new Vector3(0,0,0));
    // ここまで

});


// 毎フレーム実行される処理
$.onUpdate(deltaTime => {
    // 初期化
    if (!$.state.initialized) {
        $.state.initialized = true;
        $.state.player = null;
        $.state.animationTime = 0;
        $.state.waitingTime = 0;
    }


    // 対象のプレイヤーを取得。対象がない、または退室済みなどの場合は終了
    let player = $.state.player;
    if (!player || !player.exists()) return;    


    // アニメーションの再生時間を更新
    let animationTime = $.state.animationTime + deltaTime;


    // 再生時間がアニメーションの長さを超えていたらリセットして終了
    if (animationTime > animationLength) {
        if (player) {
            player.setHumanoidPose(null);

	// むさし追加(パルクールワープ)
	        player.setPosition(new Vector3(0,0,0));
	// ここまで

        }
       
        $.state.player = null;
        return;
    }


    // 前回ポーズを設定してからの時間を更新
    let waitingTime = $.state.waitingTime + deltaTime;


    // 前回ポーズを設定してから一定時間が経過していた場合にポーズを更新
    if (waitingTime >= interval) {
        // アニメーションクリップから現在の再生時間でのポーズを取得
        let pose = animation.getSample(animationTime);


        // プレイヤーにポーズを適用
        player.setHumanoidPose(pose);


        // 経過時間をリセット
        waitingTime = 0;
    }


    $.state.animationTime = animationTime;
    $.state.waitingTime = waitingTime;
});

むさし追加コード3行の中にある
パラメータを任意の値に変更すると
パルクールの動きを自然な動きに
なじませることができます。

7 サンプルワールド

ワールド内のパルクールアイテムに仕込んである
パラメータ情報を参考に掲載します。
フシギさんの番号アイテムと
ぷちょうさんの座標計アイテムで
照合してみてください。

パラメータ情報

8 元祖パルクールワールド

9 お礼

これまでの成果をまとめ
発表する機会を用意してくれた
Cluster公式さまに感謝です!
とても勉強になりました。

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