Unityでオプション設定の切り替えボタンを作成する

記事内に広告が含まれています。

今回はゲームのオプション設定を切り替えるボタンを作成していきます。

複数の設定がある場合は選択式で選ぶ必要がありますが、設定が有効か無効かを切り替えるだけの場合はボタンを押すたびに設定を切り替えた方が楽です。

というわけで、自身のタイピングゲームで使ったオプション設定を切り替えるボタンに似たものを作成していきたいと思います。

FinalTyping
Unityを使って作成したローマ字入力のタイピングゲームです。

今回の機能を作成すると、以下のようにボタンを押すたびに設定を切り替える機能が出来ます。

スポンサーリンク

BGMとSE用のオブジェクトを作成する

今回はBGMとSEの設定を切り替えるようにする為、BGM用とSE用のゲームオブジェクトを作成し、それぞれにAudioSourceを取り付けて再生させるようにします。

ヒエラルキー上で右クリックからCreate Emptyを選択し、名前をBGMとします。

同じようにSEも作成します。

BGMとSEのゲームオブジェクトを作成

BGMとSEゲームオブジェクトのインスペクタのAdd ComponentからAudio→Audio Sourceコンポーネントを取り付けます。

BGMゲームオブジェクトのAudio Sourceの設定は以下のようにBGMに使用するAudio Clipの設定をし、Play On Awakeにチェックを入れて(これはチェックを入れても入れなくてもいいです)スタート時に音声が流れるようにし、Loopにチェックを入れてループ再生するようにします。

BGMゲームオブジェクトのAudioSourceの設定

SEゲームオブジェクトのAudio Sourceの設定は以下のようにSE用のAudio Clipを設定します。効果音なのでPlay On Awakeのチェックを外し、ループ再生もしないのでLoopのチェックを外しています。

SEゲームおぶえじぇくとのAudio Sourceの設定

AudioSourceの設定については以下の記事を参照してください。

Unityの音の設定と音の鳴り方を確認してみる
Unityの音のインポート設定とゲームオブジェクトに音声を設定し音の鳴り方を確認してみます。2Dサウンドと3Dサウンドの切り替え方法等も確認します。

UIを作成する

設定項目のタイトルのテキスト、設定を切り替えるボタンのUIを作成していきます。

今回はテキストをTextMeshProで作成していきますが、旧UGUIのTextを使っても構いません。

旧Textの方が簡単に話が進むんでそちらで作ろうとも思うんですが、既にLegacyになっているので記事で紹介するのは少し抵抗があるのでTextMeshProを使っています。(^_^;)

TextMeshProに関しては以下の記事を参照してください。

UnityのTextMeshProを使ってみる
UnityのTextMeshとUGUIの進化版であるTextMeshProの使い方を学習し、テキストを操作してみたいと思います。

ヒエラルキーで右クリックからUI→Text – TextMeshProを選択し、名前をBGMTitleとします。

BGMTitleゲームオブジェクトのインスペクタでText InputにBGMと入力します。

BGMTitleのText InputにBGMと入力する

ヒエラルキーでBGMTitleを選択した状態でCtrl+Dキーを押して複製し、名前をSETitleとします。

SETitleのText InputにはSEと入力します。

次にヒエラルキーのCanvasを選択した状態で右クリックからUI→Button – TextMeshProを選択し、名前をBGMButtonとします。

BGMButtonの子のText(TMP)を選択し、インスペクタのText InputのONと入力します。

ヒエラルキーのBGMButtonを選択し、Ctrl+Dキーを押して複製し、名前をSEButtonとします。

現時点では設定タイトルとボタンの位置がバラバラになっていますので、これを整理して表示したいと思います。

ヒエラルキーのCanvasを選択し、インスペクタのAdd ComponentからLayout→Grid Layoutコンポーネントを取り付けます。

Grid Layoutコンポーネントは取り付けたゲームオブジェクトの子の並びをグリッド上に整列させることが出来ます。

CanvasのインスペクタのGrid Layoutの設定を以下のように変更します。

オプション設定ボタンの並びを変更するGrid Layoutの設定

Cell Sizeで子のUIのセルのサイズを設定し、Spacingでセル間のXとYの幅を設定し、Child Alignmentで子の配置位置を設定し、ConstraintをFixed Column Countにし列の数に応じてUIの要素を次の行に表示するようにします。

今回の場合はタイトルとボタンを1組として1行にしたいので、Constraint Countを2にします。

現時点では以下のような配置になります。

初期のBGMとSEの配置

BGMタイトルの右にBGMの設定を切り替えるボタンがきて、SEタイトルの右にSEの設定を切り替えるボタンがきてほしいのでヒエラルキーでUIの順番を変更します。

ヒエラルキーでBGMButtonゲームオブジェクトを選択し、BGMTitleゲームオブジェクトの下にドラッグします。

オプション設定のUIの並び順を変える

BGMTitleとSETitle自体の配置位置の為にボタンと少しずれています。

オプションタイトルとボタンの位置がずれている

Ctrlキーを押しながらBGMTitleとSETitleゲームオブジェクトの2つを選択し、TextMeshProのMain SettingsのAlignmentを変更します。

オプションタイトルのAlignmentの設定

これでタイトル位置がボタンの並びと合うようになりました。

オプションタイトルとボタンの位置が合うようになった

これでUIが出来ました。

オプション切り替えスクリプトの作成

オプションを切り替えるスクリプトを作成します。

新しくOptionSettingスクリプトを作成し、Canvasゲームオブジェクトに取り付けます。

bgmButtonTextとseButtonTextは各ボタンの子のテキストをインスペクタで設定します。

BGMとSEの設定のプロパティを用意します。

BGMとSEのAudioSourceを操作する必要があるので設定を出来るようにします。

StartメソッドではInitializeOptionSettingsメソッドを呼んで初期設定を反映させるメソッドを実行します。

InitializeOptionSettingsメソッドではBGMが有効な設定の場合はbgmAudioSourceを再生し、BGMButtonの子のテキストをONに書き換えます。

BGMSettingsが無効の場合はBGMを止め、テキストをOFFにします。

同様にSESettingsの状態に応じてボタンの子のテキストを変更します。

OnPushBGMButtonメソッドはBGMの切り替えボタンを押した時に呼び出すようにします。

BGMボタンを押した時はSESettingsが有効な場合は効果音を鳴らします。

その後BGMSettingsの設定を!を使って反転し、trueならfalse、falseならtrueへと変更しそれを再度BGMSettingsに入れます。

その後はInitializeOptionSettingsメソッドとやっていることは同じです。

OnPushSEButtonメソッドはSEボタンを押した時に呼び出すようにします。

こちらの場合はSESettingsを反転し、SESettingsが有効な場合は効果音を鳴らし、無効な場合は効果音を止めます。

OptionSettingのBGMButtonTextにはBGMButtonの子のテキスト、SEButtonTextにはSEButtonの子のテキスト、BGMAudioSourceにはBGMゲームオブジェクト、SEAudioSourceにはSEゲームオブジェクトをドラッグ&ドロップして設定します。

OptionSettingの設定

ボタンを押した時にメソッドを実行する

最後にボタンを押した時にOptionSettingスクリプトのメソッドを実行するようにします。

ヒエラルキーでBGMButtonゲームオブジェクトを選択し、ButtonのOnClickの+を押し、オブジェクトを設定する部分にヒエラルキーのCanvasをドラッグ&ドロップし、OptionSettingスクリプトのOnPushBGMButtonメソッドを実行するようにします。

BGMButtonを押した時にOnPushBGMButtonメソッドを実行するようにする

同様にSEButtonのButtonのOnClickのゲームオブジェクトにCanvasをドラッグ&ドロップし、OptionSettingのOnPushSEButtonメソッドを実行するようにします。

SEButtonボタンを押した時にOnPushSEButtonメソッドを実行する

今回はボタンのOnClickにボタンをクリックした時に実行するメソッドを設定していますが、スクリプトから実行するメソッドを設定することも出来るのでそちらにしたい場合は以下の記事を参照してください。

Unityでスクリプトからボタンのイベントリスナーを取り付ける
Unityでスクリプトからボタン操作のイベントリスナーを取り付けるようにしてみます。

音声を鳴らす場合はスクリプトから該当するAudioClipを設定したAudioSourceコンポーネントのPlayメソッドやPlayOneShotメソッド等を鳴らしたい場面で呼び出すことになりますが、その際にif文でOptionSettingスクリプトのBGMSettingsやSESettingsプロパティの値を確認し、trueであれば音声を鳴らすという感じにすると設定によって鳴らすか鳴らさないかということが出来ます。

終わりに

今回はOptionSettingスクリプトで設定値を持っているのでシーンをまたいだ時に面倒なことになります。

シーンをまたいで音声の設定値を使う場合は設置値をScriptableObjectで作ったファイルデータとして持っておいて、OptionSettingsではそのファイルをインスペクタで設定出来るようにしておくか、OptionSettingスクリプトを取り付けたゲームオブジェクトがシーンを移動した後も残るようにしておくなどのやり方があります。

この辺のことは

Unityでシーンを移動した時のデータやゲームオブジェクトの引き継ぎ
Unityのゲームで別のシーンに移動した時に前のシーンで使っていたゲームオブジェクトやデータを今のシーンで使う方法を考えていきます
UnityのScriptableObjectを使ったシーン間のデータ共有
UnityのScriptableObjectを使ってシーンを移動した時にデータを共有出来るようにします。

等を参考にしてください。

タイトルとURLをコピーしました