キャッスルバーニアの一番特徴である「バーニアアクション」を支える技術についてです。
バーニアの出力はスティックの倒す量で小・中・大の3段階に切り替わります。
本当はスティックの倒した量でパーティクル自体のエミッション量を制御したかったんですが、ちょっと難しそうだったので3段階用意しました。
そしてパーティクル自体に当たり判定を付けることでバーニアの出力=パーティクル数=攻撃力としています。例えば出力が大のときはこんなコリジョンが発生しています。
ちなみに出力が大のときは中と小、出力が中のときは小のパーティクルが同時に出ています。
パーティクルのコリジョンを有効にするにはParticleSystemのCollisionを有効にし、さらにSend Collision Messageを有効にする必要があります。
これでOnParticleCollisionが入ってくるのでスクリプトで処理するだけです。
キャッスルバーニアではヒット数のみカウントして、実際のヒット処理はUpadteで行っています。イメージとしてはこんな感じです。
void OnParticleCollision(GameObject other)
{
hitCount++;
}
void Update()
{
if( hitCount != prevFrameHitCount)
{
prevFrameHitCount = hitCount;
// ヒット処理
}
}
全てのColliderに対して判定する必要がなければCollisionWithで当たり判定対象のレイヤーを設定できます。
とりあえずParticleSystemを正しく設定すればこのような防火シャッターみたいなのはすぐに作れます。シャッターになる方にもColliderを入れることをお忘れなく!
なおゲーム中ササ姫に炎が当たらないのは炎除けのSphere Colliderが入っているから炎は友達だからです、きっと。
OnParticleCollisionは結構前からあったと思いますが使ったのは今回が初めてです。もしOnParticleCollisionが期待動作しなかったらキャッスルバーニアは誕生しなかったかもしれません。
ただ、パーティクルの量を出すとそれなりに処理負荷も高くなりそうですし、パーティクルシステムの仕様に依存するので(動的にエミッション量を変えられないとか?)、今ならECSで独自実装するのも面白いかもしれません。
ちなみに最初は扇形で判定してました。バーニア出力に合わせて半径を変えれば出力に対して当たり判定を取ることもできますが、OnParticleCollisionを使えば見た目と当たり判定も一致しますし遮蔽処理も簡単です。
と、色々書きましたが、キャッスルバーニアはUnityの標準機能に支えられていますw
あ、バーニアでの移動については単にAddForceしているだけなので特に書くことはないかな…