【Unity】攻撃アニメーション中は、キャラクターが移動しないように制御しよう!

FantasyChessRPGCharacter Unity

攻撃アニメーション中は、キャラクターが移動しないように制御しよう!

今回は、3Dのキャラクターを移動せずに攻撃できるようにします。

Unityを使ってゲーム制作する際に、攻撃Animation中にキャラクターが動いてしまうけど、どうしたら停止したまま攻撃するようになるのかわからない!って人が結構いると思います。

前回解説した記事でも攻撃Animation中にキャラクターが動いていました。

【Unity】初心者でもできる!3DAnimation
UnityのAnimationの使い方を分かりやすく解説しています。 3Dオブジェクトのダウンロードから、Animation Controllerの設定方法、Animator Windowの使い方、実際にアニメーションをさせるためのスクリプトに至るまでをすべてを解説しています。

今回は、StateMachineBehaviourを使用することで攻撃時に移動しないように制御します。

AddBehaviour

Animator Windowを開き、プレイヤーが攻撃時に使用するAnimatorを選択します。

次に、AddBehaviourでStateMachineBehaviourを追加します。

今回は、主人公がArthurなのでArthurAttackBehaviourとします。

ArthurAttackBehaviourの編集

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class ArthurAttackBehaviour : StateMachineBehaviour
{
// OnStateEnter is called when a transition starts and the state machine starts to evaluate this state
//override public void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
//{
//
//}// OnStateUpdate is called on each Update frame between OnStateEnter and OnStateExit callbacks
//override public void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
//{
//
//}// OnStateExit is called when a transition ends and the state machine finishes evaluating this state
//override public void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
//{
//
//}// OnStateMove is called right after Animator.OnAnimatorMove()
//override public void OnStateMove(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
//{
// // Implement code that processes and affects root motion
//}

// OnStateIK is called right after Animator.OnAnimatorIK()
//override public void OnStateIK(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
//{
// // Implement code that sets up animation IK (inverse kinematics)
//}
}

Scriptを開くとすべてコメントアウトされていますが、必要な場所のみ解除します。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class ArthurAttackBehaviour : StateMachineBehaviour
{
// OnStateEnter is called when a transition starts and the state machine starts to evaluate this state
override public void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
{}// OnStateUpdate is called on each Update frame between OnStateEnter and OnStateExit callbacks
override public void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
{}

// OnStateExit is called when a transition ends and the state machine finishes evaluating this state
override public void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
{

}

// OnStateMove is called right after Animator.OnAnimatorMove()
//override public void OnStateMove(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
//{
// // Implement code that processes and affects root motion
//}

// OnStateIK is called right after Animator.OnAnimatorIK()
//override public void OnStateIK(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
//{
// // Implement code that sets up animation IK (inverse kinematics)
//}
}

それでは、説明していきます。

まずこちらの、OnStateEnterは、Animation開始時に呼び出されます。

// OnStateEnter is called when a transition starts and the state machine starts to evaluate this state
override public void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
{}

次に、OnStateUpdateは、Animation実行中に呼び出されます。

// OnStateUpdate is called on each Update frame between OnStateEnter and OnStateExit callbacks
override public void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
{

}

最後に、OnStateExitは、Animation終了時に呼び出されます。

// OnStateExit is called when a transition ends and the state machine finishes evaluating this state
override public void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
{}

これを利用して、攻撃時に移動しないようにします。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class ArthurAttackBehviour : StateMachineBehaviour
{Vector3 currentPosition;
Quaternion currentRotation;

// OnStateEnter is called when a transition starts and the state machine starts to evaluate this state
override public void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
{
currentPosition = animator.transform.position;
//Animation開始時の位置情報取得
currentRotation = animator.transform.rotation;
//Animation開始時の向きを取得
}

// OnStateUpdate is called on each Update frame between OnStateEnter and OnStateExit callbacks
override public void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
{
animator.transform.position = currentPosition;
//取得した位置情報を読み込む
animator.transform.rotation = currentRotation;
//取得した向きを取得
}

// OnStateExit is called when a transition ends and the state machine finishes evaluating this state
override public void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
{
animator.transform.position = currentPosition;
//取得した位置情報を読み込む
animator.transform.rotation = currentRotation;
//取得した向きを取得
}

// OnStateMove is called right after Animator.OnAnimatorMove()
//override public void OnStateMove(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
//{
// // Implement code that processes and affects root motion
//}

// OnStateIK is called right after Animator.OnAnimatorIK()
//override public void OnStateIK(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
//{
// // Implement code that sets up animation IK (inverse kinematics)
//}
}

これで完了です。

まとめ

StateMachineBehaviourを使うことで、たったこれだけのプログラムでPlayerが攻撃時に移動しないようになります。Animationを作成するさい非常に便利なので覚えておくようにしましょう!

コメント

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