CorgiEngineメモ#6
ゴールを置きたい
アクションゲームとゴールは、切っても切れない関係だろう。ってなわけで、今回はCorgiEngine使ってどーやってステージ内にゴールを設定するのか、試したろうじゃないの。
しかし、今弄っているデモ用シーン「MinimalLevel」にはゴールっぽいものが存在しない。仕方がないので、他のデモを漁ってみることにした。
そうすっと、「MinimalOneWayLevelHorizontal」とかいうデモに、あからさまにゴールっぽい某が置かれていた。
実際にプレイしてみると、ゴールの前でボタンを押したら他のシーンに移動するっぽい事が分かった。そいじゃあ、次はこいつの中身を覗いてみよう。
ゴールした時にシーンを遷移させる
そいつのインスペクタを調べてみると、「Finish Level」とかいうコンポーネントがくっついていた。おそらく、テキトーなGameObjectに対して、BoxCollider2D(Trigger)と一緒に、こいつをくっつけてやれば、ゴールとして機能するようになるのだろう。
FinishLevelコンポーネントの下の方に「Level Name」という項目があった。ゴールしたら、ここで書いたシーンに遷移するみたいね。
んで、下の「Delay Before Transition」に設定した秒数だけ遷移前に待機する、と。クリア時の演出を流すのに良さそう。
勝手にゴールさせたい
デモそのまんまだとゴール内でボタン押下したら遷移する形なのだが、なんか煩わしいので、ゴールに触れた瞬間クリア扱いにしてあげたい。
そんな場合は「Auto Activation」にチェック付けたげると、勝手に発動するようになるみたい。
あとついでに「ボタン押してね!」的なガイドを表示する必要もないので「Use Visual Prompt」もチェックを外してやった。
ゴールが開く条件をつける
今回移植しようとしてるゲームは、画面上に散らばるフルーツ的な何かを全て集めると、ドアが開いてクリアできるという流れになっている。それをCorgiEngineで再現するにはどうすれば良いのだろうか?
色々なデモを眺めながら小一時間調べてみたが、ぶっちゃけよく分からんかった。「鍵(Key)を拾ったらそれに対応するオブジェクトが動くよ!」みたいなデモはあったのだが、ゴールとの紐付けが不明。
唯一分かったのは、「FinishLevel」の「Activable」でゴールの有効無効を切り替えられる、という事だけだった。きっと深堀りすればベストプラクティスはあるのだろうけれど、ここは一旦ゴリ押しで行くしか無さそうだ。
まあ、要はActivableを外部スクリプトから無理やり弄れば行けるのではなかろうか、という事だ。別にC#でも良いとは思うが、最近はビジュアルスクリプティング信者なのでBOLTで試してみる事に。
ひとまず愚直にアイテムを置いて、tagには「Fruit」とでも打っておいてやる。チェリーも32px四方で描き直したぜ畜生が。
そういや、BOLTから各種アセットとかに含まれるC#スクリプトにアクセスする為には、SetupWizardで認識させなあかんやったなぁ。って事で「MoreMountains.CorgiEngine」のnamespace参照を追加。
今回BOLTからアクセスしたい「FinishLevel」を追加しといてやる。
さっきのオレンジ色の扉にFlowMachineコンポーネントを追加して、GraphエディタでLock(閉鎖)状態とUnlock(開放)状態を追加。その間をテキトーにTransitionで繋ぐ。
Lock状態に入ったとき(というよりSceneが読み込まれた瞬間)に、FinishLevelのActivableをFalseにして、ゴールできなくしておく。
あと暫定的ではあるのだが、閉鎖状態が視覚的に分かるようにSpriteRendererで色を暗めに弄っておく。
LockからUnlockへの遷移条件として、FindGameObjectsWithTagでFruitが全滅したら遷移、ってな感じにしておく。毎フレーム監視なので処理負荷はそこそこあるかもしれんが、まあしょぼいゲームだからテキトーでよかろう。
Unlock状態では、FinishLevelのToggleActivable()を呼び出す。リファレンス一切読んでないが、このメソッドでActivableが切り替わるようだ。
あと、忘れずにSpriteRendererのColorも元に戻しといてやる。
結果、こんな感じでアイテム全滅させたら遷移できるように。まあ、そら自力でスクリプト組めば、なんでもありだもんなぁ。
ゴールしたときのエフェクトをつける
今回移植しようとしてるゲームは、クリアしたときに花火っぽいなにかを出すようになっている。じゃあ、CorgiEngineの仕組みに乗っかって、ゴールした時にそういったエフェクトを出すには、どうすればいいんだろうか?
ざっと眺めてると、「Activation Feedback」なるものが目に入った。ものすごく怪しい。おそらく、MM Feedbacks コンポーネントを持つGameObjectをここにぶちこめば、それっぽい反応をしてくれるのではないだろうか。
物は試し。Scene内に空のGameObjectを作ってやり、MMFeedbacksコンポーネントをくっつけてやる。「Add new feedback...」のあたりを選択すると、SoundとかCameraとか色々な選択肢が出てくるのだが、その中にバッチリとParticlesがあったので、あからさまにParticleを生成してくれそうな「Particle Instatiation」を選択。
なんか既視感あると思ったら、前回プレイヤーの死亡エフェクトを設定した時のアレだ。そうか、きっとこのFeedbacksってのは、有事の際に発動する某なんやな?
Particles Prefabにテキトーなエフェクトを作ってくっつけたのだが、たぶんこのままだとゴールと全く同じ座標で再生されるので、キャラの頭上に来るように「Position」のOffsetを、若干上に調整しといてやる。
あと、忘れずに「Finish Level」コンポーネントの「Delay Before Transition」の秒数を弄って、演出を見せるための時間は確保しておく。2~3秒ぐらいかね。
結果、期待どおりにエフェクトが再生されるようになった。ちょっと花火が雑すぎるが、今度ちゃんと調整しよ。しかしParticleよく分からん。
今回は大量に書いたので疲れた。休む!
この記事が気に入ったらサポートをしてみませんか?