ミニゲームエレメントの概要
- BTA(Kelorin Jo)
- 2019年12月31日
- 読了時間: 6分
更新日:2021年1月22日
Unityでノンコードでミニゲーム作れるようにするためのゲームの構成要素集、
名付けてミニゲームエレメント

電線作ったりして新たに体得したことが増えたので、いま一度再構築しています。
2021/01/22 要改修のため一時非公開にします
2020/01/10 FANBOXで配布しました
https://www.pixiv.net/fanbox/creator/1177/post/761861
●ステージスタート・クリアシステム
タイトル画面、ゲーム開始前処理、スタート、ステージクリア演出、ゲームオーバーとリトライ、ゲーム終了処理を管理するスクリプトです


・シーンロードしたら時間を止めてスタート前のロゴ表示、
その後、外からイベントでステージクリアのメソッドを実行したら、フラグCleargameがtrueになり、ステージクリアの演出を出して数秒後にタイトル画面に戻る(シーンのロードまたはリロード)、という仕事をします。
シーンのロードには、ビルド設定に使うシーンを割り当てる必要があります。
・タイトル用シーン+シーンチェンジスクリプトを使わず本編1シーンで完結できるオプションをつけました。その場合シーンロードせずタイトル画面用UIを出したり消したり時間止めたりします。
・タイトル画面での入力受付は全キーボード+マウスボタンのみで、BGMやSEを設定できます。
・ESCを押したらアプリ終了の処理
・トリガーイベントやスコアカウンターイベントでは制御できないタイミングでの、オーディオソース再生を受け持ちます。※全体の音量設定などはなし
・各ロゴは自作のものに差し替えれます。画像・UIと言わずゲームオブジェクトなら何でもいいです。ただしスタートボタンはイベントトリガーやボタンをアタッチしてないと先に進めない場合があります

・(未実装)インベクターのキャラコントローラでテストしたら、DontDestroyOnLoadがオフにできず、タイトル画面に戻ってもキャラが残り続けて苦しめられたので、強制的にシーンチェンジ時に削除できるようにしたいけど…
●スコアカウンター
スコアとタイマーとフラグを管理します。

・スコアは外からイベントで加算できます。

タイマーは減算表示でイベントでカウントダウン・リセット、0になったらイベント発動の操作ができます。
・フラグは、フラグといってもブールでなく一定数集めたらイベント発動する方式です。
フラグは加算で規定値をこえたら任意の処理イベントが発動できる、減算のカウンター表示計算を切り替えられます
なおフラグ成立したらずっとイベントを実行し続けるので、一度だけ実行させたい場合はフラグリセットのイベントも操作します
・ほんとは、ステージをまたいで仕事し続けてほしいオブジェクトには、DontDestroyOnLoadの処理が必要で、かつシーンに一つしかあってはならないオブジェクトだったらシングルトンの処理が必要になります。つまりスコア計算のスクリプトをアタッチしたオブジェクトにうってつけなのですが、
でも複数ステージ対応までやったらそれはミニゲームじゃないわということで、今回は実装を見送ります。
・ハイスコアはPrefに保存してます。
●ゲームギミックのスクリプト
・簡易コントローラ
マウスやタッチで操作できるようにUIボタンを実装、アタッチしたオブジェクトに作用します。
指定した座標に移動とか各種イベント実行みたいな。
複数のマウスボタンの、クリック、ドラッグ(というか長押し)、スワイプに対応

ドラッグは押した時間に比例した変数の増加、スワイプはスピードとベクトル取得ができます。
が、
ドラッグ・スワイプで色々値を取得できるものの、それらを引数として任意のメソッドに渡すのをノンコードで実現、というのは難しかったので、現時点では何も機能しません
本格的なキーボード・コントローラなどの操作はプロジェクトを書き換える=他のキャラクターコントローラと競合することになるので、実装しません。
てか簡単な移動の設定だけでもめっちゃ長くなってしまったので、万能かつ使いやすいコントローラの実装なんてとても無理、やりたい操作がほしかったら自力でプログラム組むしかないやって結論になります
・トリガーイベンター
アタッチしたオブジェクトにトリガーボックスコライダーを作成して、何かが衝突したら任意のイベントを発動させられます。

カメラにレイキャスト、シーンにイベントシステム、アタッチしたオブジェクトにRigidbodyがついてる必要があります。
単なるon Trigger Eventでは、衝突してきたもの自体(other)に直接イベントを作用できないので、専用のイベントも(冗長だけど)実装します。

アドフォース、削除、衝突座標にオブジェクトスポーン、などできます
※移動系処理には、対象オブジェクトのStaticを外し、Rigidbodyがついてる必要があります
・レイキャスター
アタッチしたオブジェクトからレイを飛ばして検知します。
遮蔽物に判定が遮られるセンサーです

オブジェクト名、レイヤーid、タグで判定して合致したらイベントを発動させられます。
ライン、ボックス、スフイア、カプセルの4種に対応

一体のみ検知します。
常時検知と外からイベントで呼び出して一度だけ検知の切り替え
※画像は製作途中で、実物はトリガーイベンター同様アドフォース、削除、衝突座標にオブジェクトスポーン、などができます
・(未実装)サーチオブジェクト
シーン中の特定のオブジェクトの座標や状態を調べ上げて監視し、条件を満たしたらイベント実行させます。
トリガーコライダーが効かない状況(同時に複数のオブジェクトが接触するとかでなるぽい)なんてあったので、最後の手段として必要…かも。
いざ作ると不毛にめんどく重いときくので実装は見送りました
・アドフォース
フォースやインパルスなど物理演算パワーを外部からイベントで発動です。
Vector3のプリセットを複数用意して、外から番号を指定して実行できます。これで、任意の方向に力を付与できます。
※対象オブジェクトがStaticを外し、Rigidbodyがついてる必要があります
・自作トゥイーン
自動回転、2つの座標を移動、ゆっくり向く、など単純な動きが制御できます
↓炊飯器の方を向き続ける室外機

・遅れてイベント実行
ディレイにはコルーチンが定番だそうですが自分で動かすと全く仕事しなかったので、非効率的に変数でカウントダウンとif文で動かします。
・オブジェクトスポーン
アタッチしたオブジェクトの周りに、任意のオブジェクトを生成します。
プールはないので作りすぎ禁物です。
フリーのプールシステムはいくつかあるので大量に作りたい場合はそれでどうぞ…
なおleanPoolは実装は超簡単だけどなぜかコライダーが効かなくなるなどの不具合が出ました
・メモ
使用方法などを記したテキストをオブジェクトにとりつけられます。

ここまで揃ってれば、プログラム知識皆無でもゲームとして成立する体裁を整えてなにか作れるでしょう。
難しいことはそんなにしてないので、足りない機能は追加も用意でしょう。 あとはアイデア!