【cluster】アニメーション再生エリアと解除エリアのサンプル

アニメーション再生エリア

animationAreaOn(Script Item、Humanoid Animation List -> ID:Animation1)
└ OverlapCollider(Overlap Detector Shape)

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

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

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

// 定期処理
$.onUpdate(deltaTime => {

  if (!$.state.initialized) {

      $.state.initialized = true;
      $.state.overlapPlayers = [];
      $.state.time = 0.0;
  }

  let previousOverlapPlayers = $.state.overlapPlayers;
  let currentOverlapPlayers = [];
  let overlaps = $.getOverlaps();

  // コライダーに侵入
  overlaps.forEach(overlap => {

    $.state.playerHandle = overlap.handle;
    if ($.state.playerHandle == null) return;
    currentOverlapPlayers.push($.state.playerHandle.id);
    //if (previousOverlapPlayers.includes($.state.playerHandle.id)) return;

    if (!$.state.initialized2) {
        $.state.initialized2 = true;
        $.state.playerHandle = null;
        $.state.animationTime = 0;
        $.state.waitingTime = 0;
    }

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

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

    // 前回ポーズを設定してから一定時間が経過していた場合にポーズを更新
    if (waitingTime >= interval) {

        // アニメーションクリップから現在の再生時間でのポーズを取得
        let pose = animation.getSample(animationTime);

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

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

    $.state.animationTime = animationTime;
    $.state.waitingTime = waitingTime;

  });

  $.state.overlapPlayers = currentOverlapPlayers;

});

アニメーション解除エリア

animationAreaOff(Script Item)
└ OverlapCollider(Overlap Detector Shape)

// 定期処理
$.onUpdate(deltaTime => {

  if (!$.state.initialized) {

      $.state.initialized = true;
      $.state.overlapPlayers = [];
      $.state.time = 0.0;
  }

  let previousOverlapPlayers = $.state.overlapPlayers;
  let currentOverlapPlayers = [];
  let overlaps = $.getOverlaps();

  // コライダーに侵入
  overlaps.forEach(overlap => {

    $.state.playerHandle = overlap.handle;
    if ($.state.playerHandle == null) return;
    currentOverlapPlayers.push($.state.playerHandle.id);
    //if (previousOverlapPlayers.includes($.state.playerHandle.id)) return;

    $.state.playerHandle.setHumanoidPose(null);

  });
  $.state.overlapPlayers = currentOverlapPlayers;

});
タイトルとURLをコピーしました