【Unity】ユニティちゃんに攻撃アニメーションをつけて当たり判定を設定しよう!
今回はユニティちゃんに攻撃アニメーションをつけて敵への当たり判定を設定する方法をご紹介します。
特定のキーを入力することで、ユニティちゃんがパンチ・キックしたりできるようにします。
さらに攻撃の当たり判定を設定することで格闘ゲームへの応用も期待できます。
ただ動かすだけでなく、攻撃ができるようになれば様々なゲームに応用ができるのでぜひ挑戦してみてください。
© Unity Technologies Japan/UCL
参考ページ)ユニティちゃん公式サイト
本記事では以下の流れで内容をご紹介します。
- ユニティちゃんを設置する
- 移動スクリプトを作成する
- 攻撃アニメーションのスクリプトを作成する
- 敵を設置する
- 手足に設置するコライダーを設定する
- 敵を破壊するスクリプトを作成する
Contents
ユニティちゃんを設置する
今回は「HQ Fighting Animation FREE」アセットを使用します。
こちらを使用することでユニティちゃんの
アセットのインポートが完了したら、ユニティちゃんをシーンに登場させましょう。
プロジェクトビューのFightingUnityChan_FreeAsset→FightingUnityChan_FreeAsset→Prefabs→Package04_animChangerをシーンビューにドラッグ&ドロップしてください。
↓ドラッグ&ドロップ
次に、編集した内容がプレハブに影響しないようにします。
先ほどドラッグ&ドロップで作成したユニティちゃんを選択して、以下赤枠GameObject→BreakPrefabInstanceを選択してください。
また、このオブジェクトの名前を「Player」に変更してください。
次に、顔部分のマテリアルを取り付けます。
プロジェクトビュー→FightingUnityChan_FreeAsset→FightingUnityChan_FreeAsset→Models→Materials→Faceを以下のようにユニティちゃんの顔部分にドラッグ&ドロップしてください。
次に、キャラクターコントローラーを取り付けます。
ヒエラルキービューのPlayerを選択して、インスペクタービュー最下部のAddComponentを選択してください。
以下赤枠のPhysics→CharacterControllerを選択してください。
キャラクターコントローラーの値を編集します。
キャラクターコントローラーの値は以下のように編集してください。
↓変更点は以下の通り
- Center:Y=1
- Radius:0.4
- Height:2
移動スクリプトを作成する
スクリプトを作成します。
スクリプトの名前を「PlayerMove」としてください。
作成したスクリプトを以下のように編集してください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 |
using System.Collections; using System.Collections.Generic; using UnityEngine; public class PlayerMove : MonoBehaviour { //重力等の変更ができるようにパブリック変数とする public float gravity; public float speed; public float jumpSpeed; public float rotateSpeed; //外部から値が変わらないようにPrivateで定義 private CharacterController characterController; private Animator animator; private Vector3 moveDirection = Vector3.zero; // Use this for initialization void Start () { characterController = GetComponent<CharacterController>(); animator = GetComponent<Animator>(); } // Update is called once per frame void Update () { //rayを使用した接地判定 if(CheckGrounded() == true){ //前進処理 if(Input.GetKey(KeyCode.UpArrow)){ moveDirection.z = speed; } else{ moveDirection.z = 0; } //方向転換 //方向キーのどちらも押されている時 if(Input.GetKey(KeyCode.LeftArrow) && Input.GetKey(KeyCode.RightArrow)){ //向きを変えない } //左方向キーが押されている時 else if(Input.GetKey(KeyCode.LeftArrow)){ transform.Rotate(0 ,rotateSpeed * -1 ,0); } //右方向キーが押されている時 else if(Input.GetKey(KeyCode.RightArrow)){ transform.Rotate(0, rotateSpeed, 0); } //jump if(Input.GetKeyDown(KeyCode.Space)){ moveDirection.y = jumpSpeed; } //重力を発生させる moveDirection.y -= gravity * Time.deltaTime; //移動の実行 Vector3 globalDirection = transform.TransformDirection(moveDirection); characterController.Move(globalDirection * Time.deltaTime); //速度が0以上の時、Runを実行する animator.SetBool("Run",moveDirection.z > 0.0f); } } //rayを使用した接地判定メソッド public bool CheckGrounded(){ //初期位置と向き var ray = new Ray(transform.position + Vector3.up * 0.1f , Vector3.down); //rayの探索範囲 var tolerance = 0.3f; //rayのHit判定 //第一引数:飛ばすRay //第二引数:Rayの最大距離 return Physics.Raycast(ray,tolerance); } } |
これによって方向キーでユニティちゃんを動かすことができます。
スクリプトをPlayerに取り付けて、変数の値を調整しましょう。
作成したPlayerMoveをヒエラルキービューのPlayerにドラッグ&ドロップすることで、スクリプトを取り付けることができます。
スクリプトを取り付けたら、ヒエラルキービューのPlayerを選択して、インスペクタービュー下部のPlayerMoveの変数の値を変更しましょう。
↓変数値の例(ここではジャンプできないような設定にしてあります)
では、実際に実行して確認してみましょう。
問題なく動くことが確認できました。
また、メインカメラをユニティちゃんの子オブジェクトに設定することでカメラを追従させることができます。
詳しい方法は以下記事をご参考ください。
参考記事)プレイヤーにカメラを追従させる方法
攻撃アニメーションのスクリプトを作成する
スクリプトを作成します。
スクリプトの名前を「Attack」としてください。
作成したスクリプトを以下のように編集してください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Attack : MonoBehaviour { //PlayerのAnimatorコンポーネント保存用 private Animator animator; // Use this for initialization void Start () { //PlayerのAnimatorコンポーネントを取得する animator = GetComponent<Animator>(); } // Update is called once per frame void Update () { //Aを押すとjab if(Input.GetKeyDown(KeyCode.A)){ animator.SetBool("Jab",true); } //Sを押すとHikick if (Input.GetKeyDown(KeyCode.S)) { animator.SetBool("Hikick", true); } //Dを押すとSpinkick if (Input.GetKeyDown(KeyCode.D)) { animator.SetBool("Spinkick", true); } } } |
作成したAttackを先ほどと同じようにPlayerに取り付けてください。
では実際に実行して確認してみましょう。
↓ユニティちゃんパンチ(Aを押す)
↓ユニティちゃんキック(Sを押す)
↓ユニティちゃん回転キック(Dを押す)
それぞれのコマンドで適切なアニメーションを設定することができました。
今回使用するアセットでは他にも攻撃のアニメーションが準備されていますので、ぜひ使用してみて下さい。
敵を設置する
まずはじめに敵を設置します。
今回は敵として「ModernZombieFree」アセットを使用します。
このアセットをダウンロード・インポートして下さい。
インポートが完了したら、ユニティちゃんと同様シーンに登場させます。
プロジェクトビュー→Zombie→ZombieRigをシーンビューにドラッグ&ドロップして下さい。
↓ドラッグ&ドロップ
ゾンビの大きさが大きすぎるのでTransformのScaleのX,Y,Zの値をそれぞれ0.3に設定しておきましょう。
作成したゾンビにタグ付けをします。
ヒエラルキービューでZombieRIgを選択して下さい。
次に以下赤枠インスペクタービューのTag→AddTagを選択します。
次にTagの下部分にある+を選択してタグを追加します。タグの名前を「Enemy」にして下さい。
↓新しいタグを追加する
次に追加したタグをゾンビに設置します。
ヒエラルキービューのZombieRigを選択、以下赤枠インスペクタービューのTag→Enemyを選択して下さい。
これでゾンビにタグ付けすることができました。
次にRigidBodyを設定します。
インスペクタービュー最下部AddComponent→Physics→Rigidbodyを選択してください。
この後スクリプトで使用するOnTriggerEnterでは接触するコライダーのどちらかにRigidbodyが設定されていないと反応しないため、忘れずにRigidbodyを設定してください。
最後にCapsuleColliderを設定します。
インスペクタービュー最下部AddComponent→Physics→CapsuleColliderを選択してください。
このままだとサイズがおかしいのでカプセルコライダーのサイズを変更します。
カプセルコライダーの値を以下のように設定してください。
↓変更点のみ記しておきます。
- Center.Y:3
- Radius:0.7
- Height:6
これで敵の設置は完了です。
手足に設置するコライダーを設定する
コライダーを設定します。
ユニティちゃんが攻撃する左手と右足にそれぞれコライダーを取り付けます。
まずは左手のコライダーから設定します。
以下赤枠ヒエラルキービューのPlayer→Character1_Reference→Character1_Hips→Character1_Spine1→・・・→Character1_LeftHandを選択してください。
次に以下赤枠インスペクタービュー最下部AddComponent→Physics→SphereColliderを選択してください。
設置したSphereColliderのRadiusを0.15に設定してください。これによってパンチによる当たり判定の範囲を決定できます。
↓Radius=0.15
また、以下のようにIsTriggerにチェックを入れてください。
IsTriggerにチェックを入れないとこの後使用するOnTriggerEnterを使用できませんのでご注意ください。
同じように右足にもSphereColliderを設定します。
以下赤枠ヒエラルキービューのPlayer→Character1_Reference→Character1_Hips→Character1_RightUpLeg→・・・→Character1_RightToeBaseにも同じくSphereColliderを設定してください。Radiusの値は任意です。
敵を破壊するスクリプトを作成する
スクリプトを作成します。
スクリプトの名前を「EnemyHit」としてください。
作成したスクリプトを以下のように編集してください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
using System.Collections; using System.Collections.Generic; using UnityEngine; public class EnemyHit : MonoBehaviour { //オブジェクトと接触した瞬間に呼び出される void OnTriggerEnter(Collider other) { //攻撃した相手がEnemyの場合 if(other.CompareTag("Enemy")){ Destroy(other.gameObject); } } } |
作成したスクリプトを先ほどSphereColliderを設定した左手と右足に設置してください。スクリプトをPlayerに設定してしまうと、うまく機能しませんのでご注意ください。
このままでは移動中に敵にぶつかった場合でも相手を消滅(Destroy)してしまうため、スクリプトを改良します。
↓移動中でも破壊してしまう
「Attack」スクリプトを編集します。
以下の改良部分(黄色で強調)を追加してください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 |
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Attack : MonoBehaviour { //PlayerのAnimatorコンポーネント保存用 private Animator animator; //左手のコライダー private Collider handCollider; //右足のコライダー private Collider footCollider; // Use this for initialization void Start () { //PlayerのAnimatorコンポーネントを取得する animator = GetComponent<Animator>(); //左手のコライダーを取得 handCollider = GameObject.Find("Character1_LeftHand").GetComponent<SphereCollider>(); //右足のコライダーを取得 footCollider = GameObject.Find("Character1_RightToeBase").GetComponent<SphereCollider>(); } // Update is called once per frame void Update () { //Aを押すとjab if(Input.GetKeyDown(KeyCode.A)){ animator.SetBool("Jab",true); //左手コライダーをオンにする handCollider.enabled = true; //一定時間後にコライダーの機能をオフにする Invoke("ColliderReset",0.3f); } //Sを押すとHikick if (Input.GetKeyDown(KeyCode.S)) { animator.SetBool("Hikick", true); //右足コライダーをオンにする footCollider.enabled = true; //一定時間後にコライダーの機能をオフにする Invoke("ColliderReset", 1.5f); } //Dを押すとSpinkick if (Input.GetKeyDown(KeyCode.D)) { animator.SetBool("Spinkick", true); //右足コライダーをオンにする footCollider.enabled = true; //一定時間後にコライダーの機能をオフにする Invoke("ColliderReset", 1.5f); } } private void ColliderReset() { handCollider.enabled = false; footCollider.enabled = false; } } |
このとき忘れずに左手と右足のSphereColliderのコンポーネントをオフにしてください。
↓コンポーネントのチェックを外してオフにする
それでは実際に実行して確認してみましょう。
↓パンチで破壊
↓キックで破壊
パンチとキックそれぞれでゾンビを倒すことができました。
まとめ
いかがでしたでしょうか。
今回はユニティちゃんに攻撃アニメーションを設定する方法・敵への攻撃の当たり判定をご紹介してきました。
相手も自分に対して攻撃をできるように作成すれば、格闘ゲームが作成できます。
今後の記事では敵が自分に対して攻撃してくる方法もご紹介する予定ですので、乞うご期待ください。
この記事はいかがでしたか?
もし「参考になった」「面白かった」という場合は、応援シェアお願いします!