見出し画像

CorgiEngineメモ#6

ゴールを置きたい

アクションゲームとゴールは、切っても切れない関係だろう。ってなわけで、今回はCorgiEngine使ってどーやってステージ内にゴールを設定するのか、試したろうじゃないの。

画像1

しかし、今弄っているデモ用シーン「MinimalLevel」にはゴールっぽいものが存在しない。仕方がないので、他のデモを漁ってみることにした。

画像2

そうすっと、「MinimalOneWayLevelHorizontal」とかいうデモに、あからさまにゴールっぽい某が置かれていた。

画像3

実際にプレイしてみると、ゴールの前でボタンを押したら他のシーンに移動するっぽい事が分かった。そいじゃあ、次はこいつの中身を覗いてみよう。

ゴールした時にシーンを遷移させる

画像4

そいつのインスペクタを調べてみると、「Finish Level」とかいうコンポーネントがくっついていた。おそらく、テキトーなGameObjectに対して、BoxCollider2D(Trigger)と一緒に、こいつをくっつけてやれば、ゴールとして機能するようになるのだろう。

画像5

FinishLevelコンポーネントの下の方に「Level Name」という項目があった。ゴールしたら、ここで書いたシーンに遷移するみたいね。

んで、下の「Delay Before Transition」に設定した秒数だけ遷移前に待機する、と。クリア時の演出を流すのに良さそう。

勝手にゴールさせたい

デモそのまんまだとゴール内でボタン押下したら遷移する形なのだが、なんか煩わしいので、ゴールに触れた瞬間クリア扱いにしてあげたい。

画像6

そんな場合は「Auto Activation」にチェック付けたげると、勝手に発動するようになるみたい。

画像7

あとついでに「ボタン押してね!」的なガイドを表示する必要もないので「Use Visual Prompt」もチェックを外してやった。

ゴールが開く条件をつける

画像20

今回移植しようとしてるゲームは、画面上に散らばるフルーツ的な何かを全て集めると、ドアが開いてクリアできるという流れになっている。それをCorgiEngineで再現するにはどうすれば良いのだろうか?

色々なデモを眺めながら小一時間調べてみたが、ぶっちゃけよく分からんかった。「鍵(Key)を拾ったらそれに対応するオブジェクトが動くよ!」みたいなデモはあったのだが、ゴールとの紐付けが不明。

唯一分かったのは、「FinishLevel」の「Activable」でゴールの有効無効を切り替えられる、という事だけだった。きっと深堀りすればベストプラクティスはあるのだろうけれど、ここは一旦ゴリ押しで行くしか無さそうだ。

まあ、要はActivableを外部スクリプトから無理やり弄れば行けるのではなかろうか、という事だ。別にC#でも良いとは思うが、最近はビジュアルスクリプティング信者なのでBOLTで試してみる事に。

画像8

ひとまず愚直にアイテムを置いて、tagには「Fruit」とでも打っておいてやる。チェリーも32px四方で描き直したぜ畜生が。

画像9

そういや、BOLTから各種アセットとかに含まれるC#スクリプトにアクセスする為には、SetupWizardで認識させなあかんやったなぁ。って事で「MoreMountains.CorgiEngine」のnamespace参照を追加。

画像10

今回BOLTからアクセスしたい「FinishLevel」を追加しといてやる。

画像11

さっきのオレンジ色の扉にFlowMachineコンポーネントを追加して、GraphエディタでLock(閉鎖)状態とUnlock(開放)状態を追加。その間をテキトーにTransitionで繋ぐ。

画像12

Lock状態に入ったとき(というよりSceneが読み込まれた瞬間)に、FinishLevelのActivableをFalseにして、ゴールできなくしておく。

あと暫定的ではあるのだが、閉鎖状態が視覚的に分かるようにSpriteRendererで色を暗めに弄っておく。

画像13

LockからUnlockへの遷移条件として、FindGameObjectsWithTagでFruitが全滅したら遷移、ってな感じにしておく。毎フレーム監視なので処理負荷はそこそこあるかもしれんが、まあしょぼいゲームだからテキトーでよかろう。

画像14

Unlock状態では、FinishLevelのToggleActivable()を呼び出す。リファレンス一切読んでないが、このメソッドでActivableが切り替わるようだ。

あと、忘れずにSpriteRendererのColorも元に戻しといてやる。

画像15

結果、こんな感じでアイテム全滅させたら遷移できるように。まあ、そら自力でスクリプト組めば、なんでもありだもんなぁ。

ゴールしたときのエフェクトをつける

画像21

今回移植しようとしてるゲームは、クリアしたときに花火っぽいなにかを出すようになっている。じゃあ、CorgiEngineの仕組みに乗っかって、ゴールした時にそういったエフェクトを出すには、どうすればいいんだろうか?

画像16

ざっと眺めてると、「Activation Feedback」なるものが目に入った。ものすごく怪しい。おそらく、MM Feedbacks コンポーネントを持つGameObjectをここにぶちこめば、それっぽい反応をしてくれるのではないだろうか。

画像17

物は試し。Scene内に空のGameObjectを作ってやり、MMFeedbacksコンポーネントをくっつけてやる。「Add new feedback...」のあたりを選択すると、SoundとかCameraとか色々な選択肢が出てくるのだが、その中にバッチリとParticlesがあったので、あからさまにParticleを生成してくれそうな「Particle Instatiation」を選択。

画像18

なんか既視感あると思ったら、前回プレイヤーの死亡エフェクトを設定した時のアレだ。そうか、きっとこのFeedbacksってのは、有事の際に発動する某なんやな?

Particles Prefabにテキトーなエフェクトを作ってくっつけたのだが、たぶんこのままだとゴールと全く同じ座標で再生されるので、キャラの頭上に来るように「Position」のOffsetを、若干上に調整しといてやる。

あと、忘れずに「Finish Level」コンポーネントの「Delay Before Transition」の秒数を弄って、演出を見せるための時間は確保しておく。2~3秒ぐらいかね。

画像19

結果、期待どおりにエフェクトが再生されるようになった。ちょっと花火が雑すぎるが、今度ちゃんと調整しよ。しかしParticleよく分からん。

今回は大量に書いたので疲れた。休む!

この記事が気に入ったらサポートをしてみませんか?