前回でボスのモデルにアニメーションが制作できました。
キャラクターが歩く等モーションだけで完結している場合はそれで問題ないと思われますが、
銃を構えてから発射など、アニメーションの特定のタイミングで連動させたい動作がある場合が
あります。
今回はその場合どうするかを見ていきたいと思います。
コンテンツ
アニメーションの出力
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」を受け取ったらボスがレーザを発射します。
まとめ
これでアニメーションからイベントを実行することができます。
後は、ビーム乱射や召喚などのアニメーションに同様のイベントを仕込めば、
ボスのアニメーション動作は一通り完成します。
アニメーションを仕込むことも大事ですがこのイベントをどうやって使うかも考えておきましょう。
コメントを残す