その3:自作ゲームのボスのアニメーションにイベントを仕込む

前回でボスのモデルにアニメーションが制作できました。

キャラクターが歩く等モーションだけで完結している場合はそれで問題ないと思われますが、

銃を構えてから発射など、アニメーションの特定のタイミングで連動させたい動作がある場合が

あります。

今回はその場合どうするかを見ていきたいと思います。

アニメーションの出力

Blenderからの出力の段階では特に何もせず普通にFBX形式で

アニメーションを出力します。

アニメーションのみの出力の場合

以下を選択し

  • オブジェクトタイプからアーマチュア選択
  • アニメーションをベイクを選択
  • デフォームボーンのみを選択

「FBXをエクスポート」でエクスポートできます。

その後作成したFBXをUnityプロジェクトのAssets以下に入れます。

Assetsに入れたFBXのインスペクターからRigを選択

  • AnimationTypeを「Humanoid」
  • AvaterDefinitionを「CopyFromOtherAvatar」
  • SoureにHumanoid形式で作成したFBXのモデルを設定

 モデルがなければアセットストアの人型モデルを使えば問題ないと思います

  • Applyを選択

アニメーションにイベントを仕込む

Animationを選択するとこのようにBlenderで作成したアニメーション一覧があります。

ここのClipsからイベントを仕込みたいアニメーションを選択した後、

更に下のほうに

Eventsがあります、そこから

「■+」を選択し、実行したいタイミングにキーを移動します。

イベントに必要な設定項目は

Functionでイベントの関数名を指定し、

以下のどれか一つを設定します。

  • Float:小数値
  • Int:整数値
  • String:文字
  • Object:プレハブなどのオブジェクト

今回はレーザの発射のアニメーションに

「AwakeAction」という関数にLaserという文字列を引数のイベントを仕込みました。

ここで設定したFunctionはアニメーションを実行する同じコンポーネントの

すべてのスクリプトに送られるため注意が必要です。

一見、便利そうですが実行してほしくない関数が同名で実装されていた場合は

暴発するので大変危険です。

※関数がprivateでも実行されます

仕込んだイベントを受け口を作成

これで、アニメーションにイベントの仕込みは終わりました。

あとは、それを受け取るスクリプトを作成します。

↓ボスのアニメーションイベント受け取るスクリプト

[RequireComponent(typeof(Animator))]
public class BossProxyAnimEvent : MonoBehaviour
{
	// ----------------------------------------------
	// 定義

	/// <summary>
	/// コマンドイベント
	/// </summary>
	[System.Serializable]
	private class CmdEvent
	{
		// コマンド
		[SerializeField]
		private string m_cmd = "";

		// イベント
		[SerializeField]
		private UnityEvent m_event = null;

		public string     Cmd   { get { return m_cmd;   } }

		public UnityEvent Event { get { return m_event; } }
	}

	// ----------------------------------------------
	// 設定項目

	// コマンドイベント
	[SerializeField]
	private CmdEvent[] m_cmdEvents = null;

	/// <summary>
	/// 起動アクション
	/// </summary>
	/// <param name="cmd">コマンド</param>
	private void AwakeAction(string cmd)
	{
		var data = m_cmdEvents.Where((a) => a.Cmd == cmd);
		foreach(var tmp in data)
		{
			tmp.Event?.Invoke();
		}
	}
}

これで先程の 「AwakeAction」 と同名の関数を作成します、

ただし、ここで実際の動作をここで実装せず一度、「UnityEvent」を介して

他のスクリプトにイベントを更に送信します。

一手間は増えますが利点として、

  • 「AwakeAction」を1つで様々なコンポーネントにイベントを遅れる
  • 実装は別に「AwakeAction」でなくてもあり物の組み合わせで様々な動作が実現できる
  • 同一コンポーネントをアニメーションとこのスクリプトのみにすることで他の「AwakeAction」の暴発を防ぐことができる

これをアニメーションを実装する同一コンポーネント上にセットし 「UnityEvent」 を設定します。

これで先程の 先程の 「AwakeAction」 の「Laser」を受け取ったらボスがレーザを発射します。

まとめ

これでアニメーションからイベントを実行することができます。

後は、ビーム乱射や召喚などのアニメーションに同様のイベントを仕込めば、

ボスのアニメーション動作は一通り完成します。

アニメーションを仕込むことも大事ですがこのイベントをどうやって使うかも考えておきましょう。


コメントを残す

メールアドレスが公開されることはありません。

ABOUT US

vuniformity誰でもない人
トレンドの行く末を見守っている
仮名を名乗るエンジニア

ゲーム開発は仕事であり趣味である
プログラムだけでなく多種多様なスキルを数多く持つ

ゲーム開発は
ソーシャルゲームを開発運用の経験アリ
ゲーム以外にも経験アリ
Webサービス保守開発等に携わる

ゲームプレイの主な戦場は
FGO
FEH
MTGA
マビノギ
ここでは主にunityroomで公開しているゲーム作り直しの軌跡を綴っていきます