Unityでキャラクターの攻撃アニメーションを作りたいんだけどどうすればいいのかな。
当たり判定、Collider(コライダー)っていうのを設定するって聞いたけどどうすればいいんだい?
アクションゲームでプレイヤーキャラや敵キャラの動きをコントロールできるようになったら敵を攻撃してダメージを与える動きを作りたいところですね。
Unityでプレイヤーキャラクターが敵を攻撃しているようにアニメーションさせるにはCollider(コライダー)を使うといいでしょう。
コライダーを設定すると物体と物体の衝突や重力などの物理的な現象の反応をコンピューターがが検知して演出できるようになります。
この衝突を検知できる機能を応用してプレイヤーキャラクターが敵を攻撃するアクションを演出します。
簡単に言えば、この動画のようなことをやります。
剣と敵本体に設定したコライダーどうしの衝突をコンピューターが検知して…
要するにプレイヤーが剣で攻撃するとそれに反応して敵キャラクターがダメージを受けてのけぞるアニメーションが発生するようにします(笑)。
言葉にすると小難しいですがアクションゲームでよく見る攻撃する、ダメージを受ける、のアレですね。
記事を読み終えれば当たり判定を自由に設定して アクションゲームで攻撃するアニメーション演出ができるようになります。
また、こちらの出した攻撃に対して敵がダメージを受ける➡こちらのアクションに対する反応が出るということ、これはゲームの面白さの大きな要素の一つです。
このゲーム内の反応の良し悪しでプレイヤーのリアクションも変わります。
作るほうのモチベーションも変わります!
初心者の方もぜひマスターしてみて下さい!
Unityの当たり判定について
Unityの当たり判定について解説します。
基礎の基礎の部分なので、そんなのはいいよという人はこちらの項目から読み進めていってください。
➡Unityの当たり判定でキャラクターの攻撃を実装する
当たり判定とは
当たり判定とは、超雑に言うと先ほど少し書いたように物体と物体の衝突をコンピューターがが検知することです。
画像のように棒が球体にぶつかると、それらが当たったことをコンピューターがを認識します。
もしUnityのような物理シミュレーションのエンジンがないものでこれをする場合、スクリプトを書いて再現しないといけないでしょう。
私のような初心者にはハードル高いですがUnityではこれを行ってくれる機能がついていますのでかなり楽にできます(笑)。
アクションゲームなどを作るときはこれを応用して、
例えばプレイヤーが振った剣で敵が攻撃されると、その剣が敵に当たったことを検知して何かしらの反応を発生させるようにします。
敵がのけぞる、倒れるなどのアニメーションを発生させたり、ズバッ、ドカッ とサウンドエフェクトが出るようにしてもいいでしょう。
アクションゲームなどでは 当たり判定でこのような演出をすることもできるわけです。
当たり判定・物理演算
より広く言えば、こうした物体と物体の衝突を検知する当たり判定含め 重力、風、摩擦、などの物理現象をシミュレーションする機能のことを物理演算・物理シミュレーションなどと言います。
この機能をうまく使うと車の走行やクラッシュ、砲弾で城壁を破壊する、ビリヤード、サッカー、テニスなどのゲームが作れます。
普段からいろいろなゲームをプレイしている人は思いつくでしょう。
いろいろなことに応用ができますがこの記事ではアクションゲームの攻撃、被ダメージに絞って解説します。
Unityで当たり判定を設定する前の準備
実際にキャラクターの移動設定をする前に以下の物を確認しておきましょう。
②使用するアセット
③アニメーターコントローラー
④前回作成したスクリプト
①Unityのバージョン、バックエンドの設定
Unityは以下のバージョンを使っています。
またInput Manager, Input System Package の新旧両方をのシステムを使うのでActive Input Handling をBoth にしてあります。
Unity Version 2021.1.16
Active Input Handling ➡Both
Active Input HandlingはメニューバーのEdit➡Project Settingから設定できます。
②使用するアセット
この記事内では以下のキャラクターを使用します。
③アニメーターコントローラー
アニメーターコントローラーの基本的な使い方はこちらの記事にまとめました。
Unityで3Dゲームを作ろう!と思ったときにどうすればいいのだろう? Unityでキャラクターを動かすときに、アニメーターコントローラー(Animator Controller) というものが[…]
④前回作成したスクリプト
プレイヤーキャラクターのスクリプトは以前作成した記事のこのスクリプトをもとに書いています。
Unityでキャラクターを歩いて移動させたいんだけど、どうすればいいっすかね? この記事はUnity初心者でゲーム開発をしたいと思っていて、3D空間でキャラクターを動かせるようになりたい人のために書きました。 U[…]
Unityの当たり判定でキャラクターの攻撃を実装する
ではここから敵キャラクターのダメージを受けるアニメーションとプレイヤーキャラの攻撃アニメーションを実装していきます。
以下の手順で行います。
①ダメージ発生のスクリプト作成
②プレイヤーキャラクターのアニメーション・コライダー設定
③敵キャラクターのアニメーション・コライダー設定
④アニメーションイベントで攻撃ダメージのタイミング設定
①ダメージ発生のスクリプト作成
まずダメージを発生させるスクリプトを作っておきます。
このようなシンプルなスクリプトです。
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Damager : MonoBehaviour { public int damage; }
このスクリプトをプレイヤーキャラ、敵キャラの各武器にアタッチしておきます。
②プレイヤーキャラクターのアニメーション・コライダー設定
キャラクターのアニメーターコントローラーに被ダメージ(ダメージを受ける)アニメーションをドラッグし
Any State ➡GetHit_SwordSheild ➡ Idle_SwordShield
となるようにアニメーションステートをMakeTransitionでつなぎます。
このとき、Anystate➡GetHit_SwordSheild の間のベクトルでは上記画像左側のようにHasExitTimeのチェックを外しTransition Durationを0にしておきましょう。
GetHit_SwordSheild ➡ Idle_SwordShield間のベクトルはMakeTransitionでつなぐだけで大丈夫です。
これで敵から攻撃を受けた時にいつでも被ダメージニメーションに遷移できるようになります。
キャラクターの3DメッシュのほうにはCapsule Colliderをつけます。
Add Componentから CapsuleColliderを選択します。
Capsule ColliderのIs Triggerにチェックを入れてCenterで位置を、Radius,Heightでカプセル型コライダーの大きさ、位置などキャラクタの大きさに合わせて調整します。
剣にもColliderを設定します。
剣のオブジェクトを選んだ状態でAdd ComponentからMeshcoliderを選択します。
Convex、Is Triggerにチェックを入れておきましょう。
プレイヤーキャラクターのスクリプトは以下のようにしておきました。
using System.Collections; using System.Collections.Generic; using UnityEngine; public class PlayerTest_02: MonoBehaviour { private float x; private float z; public float Speed = 1.0f; float smooth = 10f; private Rigidbody rb; private Animator animator; public Collider attackCollider; void Start() { animator = GetComponent(); //アニメーションを取得する rb = GetComponent(); } void Update() { x = Input.GetAxisRaw("Horizontal"); z = Input.GetAxisRaw("Vertical"); Vector3 target_dir = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical")); rb.velocity = new Vector3(x, 0, z) * Speed; //歩く速度 animator.SetFloat("Walk", rb.velocity.magnitude); //歩くアニメーションに切り替える if (target_dir.magnitude > 0.1) { //キーを押し方向転換 Quaternion rotation = Quaternion.LookRotation(target_dir); transform.rotation = Quaternion.Lerp(transform.rotation, rotation, Time.deltaTime * smooth); } if (Input.GetMouseButtonDown(0)) { animator.SetTrigger("Attack"); //マウスクリックで攻撃モーション } } //武器の判定を有効or無効切り替える public void OffColliderAttack() { attackCollider.enabled = false; } public void OnColliderAttack() { attackCollider.enabled = true; } //被ダメージアニメーションを発生させる private void OnTriggerEnter(Collider other) { Damager damager = other.GetComponent(); if (damager != null) { //敵の剣に当たったら被ダメアニメーション発生 animator.SetTrigger("Gethit"); } } }
③敵キャラクターのアニメーション・コライダー設定
敵のアニメーターコントローラーにも被ダメージアニメーションを設定します。
ここでの敵はプレイヤーの攻撃を受けた時にダメージアニメーションを発生させるだけのサンドバッグのような役割なのでこれだけです(笑)。
各ベクトルの設定はプレイヤーキャラクターと同じようにします。
敵キャラクターもCapsule Colliderを設定しIs trigger にチェックを入れておきます。
剣にはBox colliderを設定して同じようにIs triggerにチェックを入れておきます。
敵キャラの武器もメッシュコライダーで設定しようと思いましたがなぜかうまくいかなかったのでBox colliderにしています。
理由は調査中です…。
スクリプトはこのようにしておきます。
ダメージアニメーションを発生させるだけなのでシンプルなものにしておきます。
using System.Collections; using System.Collections.Generic; using UnityEngine; public class SkeletonColTest : MonoBehaviour { private Animator animator; private Rigidbody rb; // Start is called before the first frame update void Start() { animator = GetComponent<Animator>(); rb = GetComponent<Rigidbody>(); } private void OnTriggerEnter(Collider other) { Damager damager = other.GetComponent<Damager>(); if (damager != null) { animator.SetTrigger("Gethit"); //プレイヤーの剣が当たったらダメージアニメーション発生 } } }
④アニメーションイベントで攻撃ダメージのタイミング設定
①②③を設定するとプレイヤーが剣を振ると敵がダメージを受けてのけぞるアニメーションを発生させるのですが、実は剣を振らない状態でプレイヤーが敵にぶつかってもダメージが発生したようになってしまいます。
それでは不自然で、しかも剣を振らないで敵に突っ込んでいくだけで敵が倒せてしまうことになるのでクリアが簡単すぎになりますよね。
ゲームとしては微妙です。
ですのでアニメーションイベントというものを使ってプレイヤーが剣を振っているときにだけ敵へのダメージが発生するようにします。
アニメーションイベントを設定するには、まずWindow➡Animation➡Animationと選択していきAnimationウィンドウを表示します。
このウィンドウでは選択したキャラクターのアニメーションデータを確認できます。
そこでヒエラルキーでプレイヤーキャラを選択した状態で画像の①でプレイヤーキャラの攻撃アニメーションを選択します。
すると攻撃アニメーションが確認できます。
プレイヤーが剣を振りだしてから振り下ろすまでのアニメーションの間でダメージが発生するようにしたいわけです。
ですので剣を振り下ろし始めたタイミング(③のあたり)までカーソルを移動させ②を押し、
剣を振り下ろし切ったタイミング(④のあたり)にまたカーソルを移動させ②を押します。
これでプレイヤーキャラクターが剣を振っているタイミング(Animationでいうところの③~④のタイミング)で敵へのダメージが発生するようになりました。
再生してみるとこの記事の最初のほうの動画のようにプレイヤーキャラクターが攻撃すると敵がダメージを受けてのけぞるようになるかと思います。
追ってくる敵にも被ダメージアニメーションを設定してみる
前回の記事で設定したAI機能で追っかけてくる敵にも被ダメージアニメーションを入れてみました。
これでさらにアクションゲームらしくなった気がしますね。
Unityの当たり判定でアクションシーンを演出しよう
今回は当たり判定を使って攻撃する、受けるのアニメーション演出をする方法を基本的なやりかたで紹介しました。
手順を復習しておきましょう。
①ダメージ発生のスクリプト作成
②プレイヤーキャラクターのアニメーション・コライダー設定
③敵キャラクターのアニメーション・コライダー設定
④アニメーションイベントで攻撃ダメージのタイミング設定
キャラクターが素手の場合は拳や足にコライダーを付ければそれで敵を攻撃できますね。
ユーザーのアクションに対しゲーム内のオブジェクトが何かしら反応してくれるようになるとゲームがより楽しいものになります。
当たり判定をうまく設定してユーザーが楽しめるリアクションを作っていきましょう!