この記事では、敵キャラクターを倒した時に視覚効果(アニメーション)をつける方法について解説します。敵キャラクターの本体にアニメーションをつける方法と、敵キャラクターの子オブジェクトにアニメーションをつける方法の2種類があります。
後者の方法では、敵キャラクターを表示しつつ、その前面に視覚効果も表示することができます。どのように見せたいかによって使い分けましょう。完成すると下記のような見た目になります。
敵キャラクターに子オブジェクトを設定する方法については、こちらの記事に整理しています。
アニメーションを使わない方法もあります。画像が用意できないときなどはこちらの方法(SlimeController.cs の Dying メソッドを参照)がよいかもしれません。
目次
【準備】アニメーション用の画像のサイズを調整する
1.アニメーション用の画像を、敵キャラクターのスケールに合わせる
敵キャラクターのスケールに合わせて、アニメーション用の画像も拡大・縮小されます。それを考慮するため、アニメーション用の画像のスケールを敵キャラクターのスケールに合わせておきます。
この記事で使用する画像は「Sunny Land」の「Sprites」⇒「Fx」⇒「enemy-death」の中にある6枚の画像です。
① 敵キャラクターのスケールをメモします
② アニメーション用の画像をシーンに登録します(サイズを確認するために使用します。後で削除します)
③ アニメーション用の画像に、①でメモした敵キャラクターのスケールを入力します
敵キャラクターとアニメーション用の画像のサイズの調整が必要な場合は、次の「2.アニメーション用の画像のピクセル数を調整する」に進みます。ちょうどよいサイズだった場合は、スキップして次に進んでください。
2.アニメーション用の画像のピクセル数を調整する
アニメーションに使う画像を選択し、インスペクターから「ユニット毎のピクセル数」を変更してサイズを調整します。画像のひとつずつを変更するのは大変なので、アニメーションに利用する画像の全てを選択して一括でサイズを変更します。
① 対象の画像を全て選択し、インスペクター「ユニット毎のピクセル数」を変更します。
② 「ユニット毎のピクセル数」の値と画像サイズの関係は以下の通りです。
画像を小さくしたい ⇒ 値を大きくする
画像を大きくしたい ⇒ 値を小さくする
③ 敵キャラクターの大きさと、アニメーション用の画像の大きさを確認しながら調整します。
④ サイズの調整ができたら、アニメーション用の画像(ヒエラルキー上のゲームオブジェクト)を削除します。
【Unity側設定1】アニメーションを登録する
方法2「敵キャラクターの子オブジェクトにアニメーションつける」を例にして説明していきます。方法1の場合は、選択するゲームオブジェクトが変わるだけで(①)、②以降の作業は同じです。
① 子オブジェクトを選択し、「アニメーション」ウィンドウ内の「作成」ボタンをクリックします
② アニメーションファイルをプロジェクトに保存します
推奨は以下の通りです。
フォルダ:
「Assets」⇒「Animations」⇒「Enemies」
ファイル名:
「EnemyDeath」
③ アニメーション用の画像を選択して、「アニメーション」ウィンドウにドラッグアンドドロップします。
画像はまとめて選択して移動させることができます。
④ アニメーションの早さを調整します。「サンプル」の値を変更します。
「サンプル」が表示されていない場合は、以下の手順に従って「Show Sample Rate」にチェックを入れてください。
【Unity側設定2】アニメーターを登録する
共通1,2が完了した人はゲームをプレイしてみてください。すると、下記の動画のようにアニメーションが自動で始まってしまうと思います。ここでは、これを修正していきます。
① アニメーションを保存した場所に、アニメーターコントローラーファイルがあるのでダブルクリックで開きます。
② 「アニメーター」ウィンドウが開くので「EnemyDeath」を削除します。
③ 「アニメーター」ウィンドウ内の空いているスペースで右クリック「ステートの作成」⇒「空」を選択します。
④ アニメーションクリップ「EnemyDeath」をドラッグアンドドロップでアニメーター上に配置します。
ゲームをプレイして、敵が倒されるアニメーションが動作しなくなれば OK です。
【プログラミング】
ここでも、方法2「敵キャラクターの子オブジェクト(当たり判定用)にアニメーションつける」を例にして説明していきます。
方法1の場合は、子オブジェクトに記載している OnTriggerEnter2D メソッド(DinoHeadController.cs)を、敵キャラクターのスクリプト(DinoController.cs)に記述します。
DinoController(敵キャラクターのスクリプト)
Dead メソッドは子オブジェクトから呼び出されます。Dead メソッドの中では、敵キャラクターを Destroy(破棄)します。
using UnityEngine;
public class DinoController : MonoBehaviour
{
public void Dead()
{
Destroy(gameObject);
}
}
DinoHeadController(子オブジェクトのスクリプト)
親オブジェクトのスクリプト(dinoController)を取得して、親オブジェクトの Dead メソッドを実行します。親オブジェクトを Destroy することで子オブジェクトも Destroy されます。
プレイヤーとの接触時(OnTriggerEnter2D メソッド)に、アニメーション「EnemyDeath」を実行します。
子オブジェクトの Dead メソッドは、アニメーションが終わったタイミングでアニメーションイベントから呼び出されます。
using UnityEngine;
public class DinoHeadController : MonoBehaviour
{
private DinoController dinoController;
private void Start()
{
GameObject dinoObj = transform.parent.gameObject;
dinoController = dinoObj.GetComponent<DinoController>();
}
private void OnTriggerEnter2D(Collider2D collision)
{
var player = collision.gameObject.GetComponent<PlayerController>();
if (player != null)
{
Animator animater = GetComponent<Animator>();
animater.Play("EnemyDeath");
}
}
private void Dead()
{
dinoController.Dead();
}
}
プログラムを作成したら、ゲームオブジェクトにアタッチします。
DinoController.cs ⇒ Dino1
DinoHeadController.cs ⇒ Dino1Head
【Unity側設定3】アニメーションイベントを登録する
アニメーションが終わったタイミングで敵キャラクターが消滅するようにします。アニメーションイベントを利用します(アニメーションイベントについてはこちらの記事で詳しく解説しています)。
① 「アニメーション」ウィンドウの中で、アニメーションの最後のフレーム部分(下図の赤枠)を右クリックします。
② 「アニメーションイベントを追加」をクリックします。
③ 下図の順にたどって、Dead メソッドを選択します
以上の内容を実施すると、敵キャラクターを倒した時の視覚効果(アニメーション)が表現できると思います。おつかれさまでした。