バナナラボ

Vtuber美作ワニのブログです

【Vtuberでもゲームが作りたい】GameEventManagerの実装の解説【Unity】

バナナラボの美作ワニです。

先日投稿した動画でGameEventManagerという謎の機能を実装しました。 www.youtube.com

これで何がしたかったかの記事になります。

やりたかったこと

今回の動画で敵の爆発演出の実装をしました。現在スプライトアニメーションでその表現をしているのですが、端宗実装しようと思ったら以下のような実装になります。

SpriteRenderer image;
Sprite[] sprites;
int index;
float time;

void Update()
{
    time += Time.deltaTime;
    if (time >= 0.05f) {
        time = 0f;
        index++;
        if (index >= sprites.Length) /* 終了処理 */
        image.sprite = sprites[index];
    }
}

現在の実装では独立してUpdateの実行を行うことを禁止にしています。*1 そうなった場合、他の実装にならってOnLoopといった関数を実装し、親レイヤーから実行させるような仕組みにしていきます。 しかし、都度都度そのような実装をしてしまうと管理しにくくなり本末転倒になってしまいます。

また複数のスプライトアニメーションを実行しよう、ってなった時に都度実装を増やさないいけなくなるためより難易度は上がっていきます。

そうなることを避けるために他のシステムにその処理をまかせてしまうという発想をとります。

発想

以下のように実装したいと考えます。

private void Crash()
{
    GameEventManager.Create()
        .Timer(0.05f, () => { image.sprite = sprites[0] })
        .Timer(0.05f, () => { image.sprite = sprites[1] })
        .Timer(0.05f, () => { image.sprite = sprites[2] })
        .Play();
}

この実装ではメソッドチェーンと呼ばれる仕組みを利用して実装します。

メソッドチェーンは、単一の文で、同一オブジェクトの複数のメソッド呼出しを可能にする便利な仕組みである。メソッドチェーンの実装はthis参照を返す一連のメソッドから構成される。チェーンの中で先に呼び出されたメソッドの返り値に対して次のメソッドを呼び出すことで、複数のメソッド呼出しが可能になる。

VNA04-J. メソッドチェーン呼出しのアトミック性を確保する

このように仕組みづくりをした場合、追加も容易になるため実装時にあまり悩む必要性はなくなります。 GameEventManagerでは以下のようにイベントを登録し、イベントを実行させる役割を持たせている。

f:id:bananalabwani:20211019223857j:plain

余談

実はこの実装、UniRxだったりUniTaskでも同様の実装を行うことができます。 そのため、本来は自前実装せずとも簡単に似た思想での実装および高いパフォーマンスでの利用を行うことができます。

UniRx完全に理解した

UniTask入門 | Unity Learning Materials

なお美作が採用しない理由としてはゲームに依存した仕組みにしたいという目的があるためあえて車輪の再発明 - Wikipediaを手段としてとっています。

宣伝

YouTubeでゲーム実況・ゲーム開発の動画投稿および配信をやっています! もしご興味があればチャンネル登録・高評価よろしくおねがいします!

www.youtube.com

*1:禁止している理由として制御しにくくなるため、独立した処理を許可しない仕組みにしている