Unityを使った3Dゲームの作り方(かめくめ)Unityを使った3Dゲームの作り方(かめくめ)ゲーム開発エンジンUnityを使った3Dゲームの制作に参考になる情報を公開しています。15今回はUnityで持ち物画面を作成したいと思います。ゲーム中に中断している時にポーズ用のUIを表示する代わりに持ち物画面を表示します。全部の持ち物分のスロット(入れ物)を用意して、持っているアイテムの種類を表すアイコンを表示します。スロットの上にマウスをがきたら情報欄にそのアイテムの情報を表示します。今回作成する持ち物画面はマウス操作で実行しますので、ゲームパッドやキー操作出来る持ち物画面を作りたい方はUnityでキーやゲームパッドで操作するステータス画面の作成Unityでマウス、キーボードやゲームパッドで操作するステータス画面の作成をしていきます。19:46を参照してください。スポンサーリンク持ち物画面UIを作成まずはPropertyUIという名前でUIを作成していきます。Canvasを作成しPropertyUIという名前に変更し、子要素にPanel、その子要素にPanelを3つ作成し、Title、Main、Informationという名前にします。TitleとInformationの子要素にUIのTextを作成します。Titleの子要素のTextコンポーネントのTextには持ち物画面のタイトル名を入れておきます。上のようにTitle、Main、Information(色ごとに分けてあります)という順になるように領域を調整します。名前やレイアウトは自由に変更してください。Layoutを選択します。Sizeで横幅と縦幅を指定します。Spacingでセル間の距離を指定します。Alignmentは子要素の並び位置Constraintsは行と列の数に制限を持たせるという設定になります。今回は上の画像のように設定しました。次にアイテムの情報を管理する為に、ItemDataスクリプトとアイテムの情報を保存しておくItemDataBaseスクリプトを作成します。今回はスクリプト上でアイテム情報の生成をしていますが、ScriptableObjectを使ってあらかじめアイテムデータファイルとアイテムデータベースを作成しておく方がわかりやすいです。UnityでScriptableObjectを使ってアイテムデータベースを作成するUnityでScriptableObjectを使ってアイテムデータベースを作成し、そこからアイテム情報を引き出せるようにします。00:16ItemDataというスクリプトを作成します。itemInformation;}}アイテム情報にはアイテムの種類を表すアイコン、アイテムの名前、アイテムのタイプ、アイテムの情報を保存出来るようにします。それぞれのデータを取得できるようにゲッターメソッドを用意します。他のクラスからItemDataクラスのインスタンスを生成する時に引数に情報を渡し、ItemDataのコンストラクタでデータを設定します。これでアイテムクラスの作成は終了です。ItemDataスクリプトはゲームオブジェクトに取り付けません。次にItemDataBaseスクリプトでアイテムを作成します。null;}}ItemDataBaseはゲームに登場するアイテムの情報をすべて保持しておく為のクラスにします。Awakeメソッドで全てのアイテム情報を設定しています(今回は3アイテムだけです)。Resources.LoadはAssetsフォルダのResourcesフォルダの中身を取得する時に使います。Resourcesフォルダは特殊フォルダで、あらかじめResourcesフォルダにインスタンス化したいプレハブ等を入れておくと利用したい時便利です。マニュアル原則として、作成したフォルダーには自由に名前を付けてプロジェクトを管理することができます。命令として読み取られる特殊なフォルダー名が存在します。これらのフォルダー名は、そのフォルダー内のコンテンツが特定の方法で扱われるよう指定する機能を持っています。エディタースクリプトが正しく機能する...docs.unity3d.com第1引数が名前、第2引数が型です。ItemDataの第2引数はアイテム名、第3引数はアイテムのタイプ、第4引数はアイテムの情報なのでそれぞれのアイテムの情報を書き込みます。これでItemDataBaseスクリプトの完成です。Componentで設定しておきます。次に個々のアイテムを入れるスロットを作成します。Mainの子要素にUI→Panelでパネルを作成し、その子要素にUI→Imageを作成します。パネルの名前をPropertySlotと変更します。Layoutのセルサイズで指定されるので、特別サイズの変更は必要ありません。作成したPropertySlotはAssetsフォルダにドラッグ&ドロップしてプレハブにし、ヒエラルキー上のPropertySlotは削除します。持ち物スロットをマウス操作した時の処理スクリプトProcessingSlotを作成スロットのマウス操作処理関連スクリプトを作成しましょう。名前はProcessingSlotとし、プレハブのPropertySlotに取り付けます。"";Destroy(itemSlotTitleUIInstance);}}}ProcessingSlotはアイテムのスロットに設定し、それぞれのスロットで自身のアイテムデータを保持します。OnDisableはゲームオブジェクトが非アクティブになった時に呼ばれるので、その時にタイトルUIが存在していればそれを削除し、自身のゲームオブジェクトを削除します。SetItemDataはこのアイテムスロットを作成した時にそのアイテムのデータを引数として渡し呼び出します。Startメソッドではアイテム情報を表示するInformationの子要素のTextを取得しています。MouseOverはアイテムスロットの上にマウスポインタが入った時に呼び出すメソッドで、アイテムの名前を表示するItemSlotTitleUIプレハブをインスタンス化します(ItemSlotTitleUIはこの後作ります)。itemSlotTitleUIInstanceの位置はスロットのサイズから調整した位置にインスタンス化しています。アイテムスロットのタイトルUIはPropertyUIの子要素のPanelに設定し、サイズ調整はプレハブで出来るようにします。アイテムスロットのタイトルUIのテキストには自身のアイテムデータの名前を設定し、Informationのテキストに自身のアイテムの情報を表示します。MouseExitはマウスポインタがアイテムスロットから出た時の処理で、インスタンス化したitemSlotTitleUIInstanceゲームオブジェクトを削除しています。これでスロットに関する処理のスクリプトが出来ました。次はこの処理で使っているItemSlotTitleUIの作成をします。PropertyUI→Panelの子要素にUI→Panelを作成し名前をItemSlotTitleUIとし、その子要素にUI→Textを作成します。↑のように設定します。↑のように親のパネルのサイズに合わせて変化させるようにします。Targetのチェックを外し、マウスポインタが重なってもイベントを無視するようにします。ItemSlotTitleUIをAssetsフォルダにドラッグ&ドロップしプレハブ化します。プレハブ化したら、さきほどのProcessingSlotスクリプトインスペクタのItemSlotTitleUIのところにItemSlotTitleUIのプレハブをドラッグ&ドロップします。プレハブにしたらヒエラルキー上のItemSlotTitleUIは削除します。Triggerを取り付けます。Exitイベントを取り付け、自身のゲームオブジェクト(PropertyUIプレハブ)を設定し取り付けてあるProcessingSlotスクリプトのMouseOverメソッドとMouserExitメソッドを設定します。21:09を参考にしてください。これでアイテムスロットの上にマウスが入った時と出て行った時の処理が完成しました。アイテム数分のスロットを表示するCreateSlotScriptスクリプトを作成するアイテムの総数分だけスロットを表示し、主人公が持っているアイテムだけスロットを表示するスクリプトを作成します。名前はCreateSlotScriptとします。スクリプトはPropertyUI→Panel→Mainに設定します。アイテム情報をスロットのProcessingSlotに設定するinstanceSlot.GetComponent<ProcessingSlot>().SetItemData(item);}}}}OnEnableメソッドはこのスクリプトを設定しているMainゲームオブジェクトがアクティブになった時に呼ばれるので、その時にCreateSlotメソッドを呼び出します。CreateSlotメソッドでは受け取ったItemDataの分だけスロットを作成しますが、そのアイテムを持っていなければスロットは作成しません。MyStatus(主人公キャラのステータス管理スクリプト)でそのアイテムを持っているかを調べます。持っていたらアイテムスロットプレハブをインスタンス化し、親をMainゲームオブジェクトにします。その後インスタンス化したアイテムスロットのlocalScaleを全て1に設定します(これをしないと0で初期化され表示されない為)。最後にインスタンス化したアイテムスロットに設定しているProcessingSlotスクリプトを取得しSetItemDataメソッドを呼び出してアイテム情報をスロットで保持するようにします。MyStatusスクリプトにアイテムを持っているかどうかの情報保持とアイテムを持っているかどうかを返すメソッドの追記します。itemFlags[itemName];}主人公のステータススクリプトでアイテムを持っているかどうかを管理します。Startメソッドでアイテム数分のアイテム名とアイテムを持っているかの情報をDictionaryに保存します。その後とりあえずゲームスタート時に持っておきたいアイテムのフラグをtrueにしています。主人公のゲームオブジェクトを選択し、インスペクタのMyStatusでItemDataBaseにItemDataBaseスクリプトを設定したゲームオブジェクトをドラッグ&ドロップします。これで持ち物画面の作成が完了しました。持ち物画面が出来たので後はゲームを中断した時に持ち物画面を呼び出し、ゲームを再開した時に消す処理を追加するだけです。ゲームを中断する方法はUnityでゲームの中断が出来るようにするUnityのゲームで一時中断してポーズ画面を表示をする機能を作成していきます。21:14を参考にしてください。持ち物画面は最初は表示したくないのでPropertyUIゲームオブジェクトは非アクティブにしておきます。↑のようにPropertyUIを非アクティブにしておかないとエラーが発生します。これで持ち物画面の作成と呼び出しが出来るようになりました。回復アイテムを使いたい場合はクリック操作で処理をするという風にするといいかもしれません。それではUnityの実行ボタンを押して確認してみましょう。上の画像は動作の一部になります。画像が少し乱れていますが・・・・。持ち物画面を作り終えてとりあえず、これで持ち物画面の作成は終了です。最初の記事からだいぶ処理を変更しました(2019/06/30)。以前はだいぶ面倒くさい処理をしてましたが、少しだけスッキリ出来たような気もします。19:04ProcessingSlotスクリプトのソースコード右側が見切れていたため、サイドへスクロールを試みたところスクロールできませんでした。サイトのデザインが変更された影響でしょうか......。23:04したいのに出来ないことは、mainオブジェクトを親にして、記事通りにprefabのpropatyslotを生成したいです。22:48unityのバージョンは2018.2.0f2です。自分の質問は記事の中でMyItemStatus(持っているアイテム管理スクリプト)のGetItemFlagメソッドにアイテムのタイプを渡し、そのアイテムを持っているかを調べます。16:23ItemDataのスクリプトでobjectを継承していますがこれだと16行目からのコンストラクタが使えなかったので修正したほうがいいと思います。18:29確認してみたところ、わたくしの環境ではItemDataBaseからItemDataクラスのインスタンス化は出来ているようです。01:21おそらくかめさんはmonobehaviourを継承するとコンストラクタが無効になることを知っていてobjectを使ったのだと思います(?)エラーはでませんがItemDataには何も入りませんでした。12:17ItemDataBaseのItemDataの中身は、PropertyUIをアクティブな状態でスタートさせていると中身が作成される前にCreateSlotScriptのCreateSlotメソッドが実行されエラーになります。CreateSlotScriptのOnEnableメソッドがItemDataBaseのAwakeメソッドで行っているItemDataクラスの作成より前に実行されてしまう為です。Unityマニュアルのイベント順ではAwake→OnEnableとなっていますが、それぞれ別のゲームオブジェクトでそれぞれのメソッドを作成しているとOnEnableが先に実行され、その後Awakeが実行されることがあるみたいです。この記事の仕様ではItemDataBaseクラスで個々のItemDataを作成するようにしている為、先にItemDataBaseクラスのAwakeが実行されるようPropertyUIを非アクティブにしています。その為、スロットを作成するタイミングをOnEnableで行わず、PropertyUIをオン・オフしているスクリプトで実行するとPropertyUIをアクティブな状態でスタートさせてもアイテムは表示されませんがエラーが出なくなります。1f;}}}}いろいろ面倒になっていますが・・・・(^_^;)実行順序でItemDataクラスが作成されていないわけじゃない場合は、わたくしにはちょっとわかりません・・・・。ScriptableObjectを使ってあらかじめアイテムのデータを作成しておいてそれを利用したり、アイテムスロットはインスタンス化で作成せず最初から置いておいたほうが良いかもしれませんね。15:03TitleUIの作成のところでプレハブ化したら、さきほどのProcessSlotのtitleUIのところにTitleUIのプレハブをドラッグ&ドロップします。16:35スクリプトをC#へと変えた時にスクリプト名を変えたのですが、文章が変わっていなかったようです。18:58すいません、RPGとかによくある「クエスト」機能なども作って頂けないでしょうか?どのクエストを受けたのか、だとか達成したのか、だとか。21:17どのクエストを受けた、達成したという情報はhttps://gametukurikata.com/program/propertyのような感じでフラグで管理して、UIで全クエストのリストを表示した時にそのフラグの値を見て表示を変えるというように作っていけば出来ると思います。上記を参考に取り組んでみてください。機能の作成については時間がかかりますのでだいぶお待ちいただく可能性があります。17:12遅くなってすいません。わかりました、頑張ります。ご回答ありがとうございました。19:44いえいえ(^^)/クエスト機能の方ですがシンプルにはなりますが作ってみました。機能自体は完成しているんですが、まだ記事の文章を作成していません。なんとか今週中には公開出来たらと思っております。参考にしてみてください。19:14本日記事を公開しました。https://gametukurikata.com/program/questになります。コメントをキャンセルメールアドレスが公開されることはありません。コメントデータの処理方法の詳細はこちらをご覧ください。サイト内検索が出来ますプロフィール管理人のかめくめちゃんです。(-_-)メールはこちらにお願いします(記事への質問はコメント欄にお願いいたします)。kamekumechan@gmail.comいずれはSIRENやバイオハザードみたいなアクションゲームを作りたいと思っています。ゲームシナリオが書けないので面白いゲームはなかなか作れません・・・・。(^_^;)名前の由来はカメが好きだからです。プロフィールになってないな・・・・(-.-)Unityをこれから始める人へこれからUnityを使ってみようという方はUnityを使った3Dゲームの作り方(かめくめ)の歩き方Unityを使った3Dゲームの作り方(かめくめ)で、はじめてUnityの学習をする時の当ブログの記事を読む順番を書きました。21:43の記事に記載の順番で見て頂くとUnityの基本的な使い方がわかり、簡単なTPSゲームの作成までが出来ます。Д`)シクシク...お知らせ2020/02/15個人的にUnity2019.3.1f6をインストールしました。2020/01/31個人的にUnity2020.1.0a21(アルファ版)をインストールしました。2018/08/07コメント欄へのわたくしの返信は停止しております。わたくしに出来る事は既に記事にしてあるので、ブログ右上の検索窓を活用してください。(._.)またブログの最初の方の機能を積み上げていく記事に関しての疑問点は当ブログ記事のスクリプトの説明と寄せられた質問への回答Unityを使った3Dゲームの作り方(かめくめ)の機能積み上げ形式の記事のスクリプトの説明と寄せられた記事の機能についての質問への回答を掲載しています。21:41も参照してみてください。コメントの返信はありませんが、回答は記事に反映されている可能性があります。当ブログはハイスピードプランです。WordPressの編集画面の動作が早くなった。Unityを使った3Dゲームの作り方(かめくめ).。