【Unity】RPGを作るチュートリアルその67 メニュー画面のアイテム機能のUIを実装

【Unity】RPGを作るチュートリアルその67 メニュー画面のアイテム機能のUIを実装

シンプルなRPGをUnityで作るチュートリアルシリーズの67回目です。

第66回ではメニュー画面の機能を作るにあたって、方針を決めてUI作成を行いました。

今回はメニュー画面の機能のうち、アイテムの表示、使用の機能を実装していきます。今回はまずUIを作成します。

 

 

制作環境

MacBook Pro 2023 Apple M2 Max

Unity6 (6000.0.30f1) Silicon

 

作業内容と順序

シンプルなRPGを作る上でどんな作業が必要か、どんな順番で作っていくと良さそうか、別ページで検討しました。基本的にこの流れに沿って進めていきます。

 

チュートリアルの一覧

このシリーズ全体の一覧は以下のページにまとめています。

 

前回の内容

前回はメニュー画面の機能を作るにあたって、方針を決めてUI作成を行いました。

 

メニュー画面の実装方針

 

メニュー画面では、

  • アイテムの使用
  • 魔法の使用
  • 装備の選択
  • ステータスの確認
  • セーブ
  • ゲームの終了
  • メニューを閉じる

の項目を作成します。今回はこのうち、アイテム使用の機能について実装していきます。

 

アイテムの一覧

アイテム画面で表示するアイテムに関しては、大体8項目くらいを縦に並べて、画面中央に表示したいと思います。また、アイテムの説明に関しては画面右側に表示します。

アイテム表示のイメージ
アイテム表示のイメージ

 

今回のチュートリアルでは、パーティ単位でアイテムを保持させるため、受け渡しの処理はなくても良さそうです。また、アイテムを捨てる機能も特に実装せず進めます。所持しているアイテムはID順に並べて表示して、移動中に使えないアイテムについてはグレーアウトするようにします。

チュートリアルの範囲だとアイテム数が少ないのでページ処理は必要なさそうですが、戦闘画面と同様に拡張性を考えてページ処理も実装しておきます。

アイテムを使用する際には画面下部にメッセージウィンドウを表示して結果を表示したいので、メニューやイベント時に使用するメッセージウィンドウも実装します。

 

UIの作成

アイテムメニュー、メッセージウィンドウを作成していきましょう。

 

アイテムメニューのUI

まずはアイテムメニューのUIを作成します。アイテム画面ではアイテムリストのウィンドウ、アイテムの説明ウィンドウを表示するため、両方の親オブジェクトとなるゲームオブジェクトから作成します。

 

アイテム画面の親オブジェクト

「MenuScreen」の子オブジェクトとして空のゲームオブジェクトを作成しましょう。名前は [ItemMenuParent] にしました。作成した「ItemMenuParent」の子オブジェクトとして、Imageのゲームオブジェクトを作成します。こちらの名前は [ItemListBackground] にしました。

アイテム画面の親オブジェクトとアイテムリストの親オブジェクト
アイテム画面の親オブジェクトとアイテムリストの親オブジェクト

 

作成した「ItemMenuParent」のゲームオブジェクトでは、アンカーの設定で [stretch – stretch] を選択し、縦横ともに引き伸ばして画面全体を覆うようにします。

アイテム画面の親オブジェクトの設定
アイテム画面の親オブジェクトの設定

 

アイテムリストを表示するゲームオブジェクト

続いてアイテムリストを表示するゲームオブジェクトでは、「Rect Transform」のコンポーネントでアンカーを左上に、「Pos X」を [290] に、「Pos Y」を [-32] に設定します。また、「Width」を [380] に、「Height」を [452] に設定しましょう。「Image」のコンポーネントでは「Source Image」の項目で [message_window] の画像を設定します。

位置と画像の設定
位置と画像の設定

 

アイテム名を表示するゲームオブジェクト

アイテム名の表示に関しては、戦闘画面と同様にアイテム表示用ゲームオブジェクトを並べて、ページごとに対応するアイテム名を入れます。既存のものをコピペして使えるので、Hierarchyウィンドウ内の戦闘用ゲームオブジェクトの中から「SelectionItem_0」をコピーしてくるか、Projectウィンドウの「Assets/Prefabs」のフォルダにある「SelectionItem」をインスタンス化します。

どちらの場合もPrefabと紐づくゲームオブジェクトとして生成されるので、既存のPrefabとのつながりをなくすために、コンテキストメニューから [Prefab] -> [Unpack] を選択します。

PrefabのUnpack
PrefabのUnpack

 

Unpackしたゲームオブジェクトの名前を [MenuItemSlot] に変更します。Inspectorウィンドウではアンカーを左上に、「Pos X」を [24] に、「Pos Y」を [0] に設定します。また、「Width」を [326] に、「Height」を [64] に設定しましょう。アタッチされている「SelectionItemController」についてはコンポーネント右上のメニューから「Remove Component」で外しておきます。

位置の設定
位置の設定

 

子オブジェクトについてはそのまま使えるので、特に変更せずでOKです。「Rect Transform」の変更が終わったら、「MenuItemSlot」のゲームオブジェクトをPrefabにします。Projectウィンドウの「Assets/Prefabs」にドラッグ&ドロップして作成します。戦闘画面で実装した「SelectionItem」と同様に、制御用のスクリプトをアタッチ予定です。

Prefabの作成
Prefabの作成

 

作成したアイテム用のゲームオブジェクトを複製して、以下のように合計8つ作成します。それぞれ名前と「Rect Transform」の「Pos Y」を変更していきます。

項目の複製
項目の複製
名前 Pos Y
MenuItemSlot_0 0
MenuItemSlot_1 -48
MenuItemSlot_2 -96
MenuItemSlot_3 -144
MenuItemSlot_4 -192
MenuItemSlot_5 -240
MenuItemSlot_6 -288
MenuItemSlot_7 -336

 

ページ処理用のゲームオブジェクト

ページ処理を行うゲームオブジェクトを作成します。前のページがある時のカーソルを左、次のページがある時のカーソルを右、中央にアイテムのページ数と合計ページ数を表示したいと思います。ページ送りは左右の矢印キーを使う予定です。

まずはページ処理関連のゲームオブジェクトをまとめる親オブジェクトを作成します。「ItemListBackground」の下に空のゲームオブジェクトを作成します。名前は [Pager] にしました。

親オブジェクトの作成
親オブジェクトの作成

 

作成した「Pager」のゲームオブジェクトに関して、Inspectorウィンドウからアンカーを [bottom-streach] に、「Height」を [64] に変更します。

アンカーと高さの設定
アンカーと高さの設定

 

続いてページ送りのカーソルを作成します。このカーソルについては、戦闘画面の選択ウィンドウで作成したものを複製して、カーソルの向きを変更します。「SelectionWindowParent」の中にある「PagerCursorPreview」と「PagerCursorNext」を複製して、「Pager」の子オブジェクトにします。

カーソルのゲームオブジェクトの作成
カーソルのゲームオブジェクトの作成

 

「PagerCursorPreview」では、アンカーを [middle-left] に、「Pos X」を [40] に、「Rotation」の「Z」を [180] に変更します。

前のページのカーソル
前のページのカーソル

 

「PagerCursorNext」では、アンカーを [middle-right] に、「Pos X」を [-40] に、「Rotation」の「Z」を [0] に変更します。

次のページのカーソル
次のページのカーソル

 

また、現在のページ数や合計のページ数が分かるように、テキストも表示しましょう。フォントなどの設定を使い回すため、「MenuItemSlot_0」のゲームオブジェクトから「ItemNameText」を複製して「Pager」の子オブジェクトにします。名前は [PagerText] にしました。

ページ表示用のテキスト
ページ表示用のテキスト

 

Inspectorウィンドウから、アンカーを [middle-stretch] に、「Height」を [50] に設定します。

位置の設定
位置の設定

 

「TextMeshPro – Text」のコンポーネントでは、「Alighnment」で中央揃え、中段を選択します。テキストは「1 / 1」と入力しました。この値は動的に生成するようにします。

テキストの表示位置を設定
テキストの表示位置を設定

 

アイテムの説明ウィンドウ

アイテムの説明を表示するウィンドウを作成します。アイテムリストと同じくウィンドウ形式にしたいので、「ItemListBackground」を複製して子オブジェクトを削除しました。名前は [ItemDescriptionBackground] に変更しています。

背景用ゲームオブジェクトの複製
背景用ゲームオブジェクトの複製

 

Inspectorウィンドウから、「Pos X」を [702] に、「Width」を [224] に、「Height」を [216] に設定します。

位置とサイズの設定
位置とサイズの設定

 

続いて、説明用のテキストを作成します。テキストの設定を使いまわしたいので、戦闘画面のメッセージウィンドウ内にある「MessageText」を複製して、「ItemDescriptionBackground」の子オブジェクトにします。名前は [ItemDescriptionText] にしました。

説明用テキストの作成
説明用テキストの作成

 

Inspectorウィンドウでは、アンカーを [stretch-stretch] に、「Left」、「Top」、「Right」、「Bottom」を [16] に設定します。

全体に広げる
全体に広げる

 

メッセージウィンドウのテキストを複製している場合、「Spacing Option」の「Line」が [36] に、「Alignment」が左揃え、中段に、「Overflow」が [Truncate] になっているかと思います。

テキストの設定
テキストの設定

 

ここまでの設定を行うと以下のように表示されるかと思います。

アイテム画面のUI
アイテム画面のUI

 

移動中のメッセージウィンドウのUI

メッセージウィンドウを作成していきます。戦闘画面用には作成してありますが、戦闘時以外は親オブジェクトが非表示になっていることから、移動中に表示できるように個別にUIを作成します。

といっても戦闘画面のメッセージウィンドウを複製するだけなのでシンプルに実装しちゃいましょう。「MessageWindowParent」を複製して「Canvas」の子オブジェクトにします。

移動用のメッセージウィンドウを作成
移動用のメッセージウィンドウを作成

 

戦闘用の「MessageUIController」がアタッチされているので、コンポーネントの右上のボタンからメニューを開き、「Remove Component」を選択して外しておきます。

コンポーネントを外す
コンポーネントを外す

 

ここまでの設定を行うと以下のように表示されます。なんとなく左右のラインが揃うように配置してみました。

メッセージウィンドウ作成後の様子
メッセージウィンドウ作成後の様子

 

ここからスクリプトの作成まで入るとメガ盛りになるので、動作部分については次回やっていきましょう。

 

今回のブランチ

 

まとめ

今回はメニュー画面の機能のうち、アイテムの表示、使用の機能を実装していく中で、まずUIを作成しました。

次回はメニュー画面のアイテム機能について動作を実装していきます。

     

ゲーム開発の攻略チャートを作りました!

CTA-IMAGE

「ゲームを作ってみたいけど、何から手を付けていいか分からない!」


そんなお悩みをお持ちの方向けに、todoがアプリをリリースした経験を中心に、ゲーム作りの手順や考慮すべき点をまとめたe-bookを作成しました。ゲーム作りはそれ自体がゲームのように楽しいプロセスなので、「攻略チャート」と名付けています。


ゲームを作り始めた時にぶつかる壁である「何をしたら良いのか分からない」という悩みを吹き飛ばしましょう!