現場レベルのゲーム制作が、すべてここで学べます。
この講座ではUnityを使って「箱庭経営シミュレーション×農場ゲーム」を作成していきます。
今回はその第6回目です。
前回はプレイヤーが畑を耕して種が成長してニンジンを収穫できる畑システムを開発しました。さらに種の所持数を追加し、畑を整地してリセットできるようにしました。
前回の記事:

第6回では、ショップシステムを追加し、前回作成した「種」や「バケツ」などのアイテムを購入できるようにしていきます。
今回は、パソコンのような端末を設置し、そこから購入するとアイテムが届く仕組みを作成していきましょう。
Unity6でお店の作り方をマスターしていきましょう!
ショップ本体オブジェクトを作成する
まずは、ショップ本体となるパソコンのようなオブジェクトを用意してみましょう。
Hierarchy上で右クリックし、Create Empty を選択して名前を ShopTerminal_PC にしましょう。

Projectウィンドウから、次のパスを開いてください。
AssetHuntsl > GameDev Starter Kit – Farming > Asset > Rock > Rock_A_01
表示された Rock_A_01 を、
Hierarchy ウィンドウの ShopTerminal_PC にドラッグ&ドロップしてください。

次にProjectウィンドウから、次のパスを開き、
AssetHuntsl > GameDev Starter Kit – Farming > Asset > Selection Pointer> Selection_Pointer_01
表示された Selection_Pointer_01 を、
Hierarchy ウィンドウの ShopTerminal_PC にドラッグ&ドロップしてください。

配置したオブジェクトを選択し、それぞれInspectorに表示されている Transform を以下のように設定してください。
ShopTerminal_PC

Rock_A_01

Selection_Pointer_01


また、「Rock_A_01」にBox Colliderを追加しておきましょう。
Hierarchyで「Rock_A_01」を選択し、Inspectorの「Add Component」から「Box Collider」を追加します。

次に、端末のディスプレイ部分をUIで作成していきます。
Hierarchy で ShopTerminal_PC を右クリックし、UI > Image を選択してください。
作成された Image オブジェクトの名前を Display に変更します。

作成できたら、Display の親である Canvas を選択し、Inspector から以下のように設定しましょう。
※Render ModeをWarld SpaceにしてからでないとRect Transformは変更できません。一番最初にRender Modeから設定するようにしましょう。

CanvasのEvent CameraのMain CameraはPlayerの子オブジェクトをセットしています。
Render Mode とは?
Canvas(UI)を“どの空間に描画するか”を決める設定です。
UIを「画面に固定で出すのか」「カメラ越しに出すのか」「3D空間に置くのか」を選びます。

3つのモード
1) Screen Space – Overlay
- 画面の最前面に直接描画される
- カメラ設定不要
- 常に画面に固定
用途例:メニュー、ポーズ画面
→ もっともシンプルで軽い

2) Screen Space – Camera
- 指定したカメラを通して描画される
- カメラの距離やDepthの影響を受ける
用途例:カメラ演出に合わせたいUI
→ Overlayより少し高度

3) World Space
- UIが“3Dオブジェクト”としてシーン内に存在する
- Transform(位置・回転・スケール)を持つ
用途例:
- 端末のディスプレイ
- 看板UI
- ワールド内のボタン
→ 今回のショップ端末はこれ

World Spaceに設定できるEvent Camera とは?
どのカメラ視点でUIのクリック判定を行うかを指定するものです。
World Space のUIは3D空間にあるため、
マウス位置を「どのカメラ基準で空間座標に変換するか」を決める必要があります。
つまり Event Camera は、
そのUIを“どの視点から操作するか”を決める設定です。
次に、Canvas を選択したまま、Inspector の Add Component をクリックし、Canvas Group を追加しましょう。
Canvas Group を追加することで、UI全体(子オブジェクト)の表示状態をまとめて制御できるようになります。

次に、Display を選択し、Inspector から以下のように設定しましょう。

次に、商品のボタンを追加していきます。
Hierarchy で Display を右クリックし、UI > Button – TextMeshPro を選択してください。
作成されたボタンの名前を Bucket_Button に変更しましょう。

作成した Bucket_Button を選択し、Inspector から以下のように設定しましょう。

次に、Bucket_Button の子オブジェクトである Text (TMP) を選択し、Inspector から以下のように設定しましょう。

テキスト↓
|
1 2 3 |
バケツ 50 (収穫用) |
設定できたら、Hierarchy から Bucket_Button を選択し、Ctrl + D を押して複製しましょう。
複製されたボタンの名前を Seed_Button に変更します。

作成した Seed_Button を選択し、Inspector から以下のように設定しましょう。

次に、Seed_Button の子オブジェクトである Text (TMP) を選択し、テキストを以下のように設定しましょう。

テキスト↓
|
1 2 |
人参の種 10 |
これで、ショップ本体となるオブジェクトの準備は完了です。
Unityでショップシステムを作成する
今回作るショップシステムって何?
今回のショップは、3つの機能が役割分担して動きます。
① ShopItemData =「商品のカード」
これは、「この商品は、いくらで、どんな物で、買えたら何が起きるか」を書いてある 商品カード です。
たとえば
- 名前:バケツ
- 値段:50円
- 在庫:1個
- 買えたら:バケツが出てくる
お金が足りなかったら:『あと○円足りません』と出す、こういう“ルール”が全部書いてあります。つまり、商品の説明書みたいなものです。
② ShopTerminal =「レジのお店の人」
これは、「実際にお金を引いたり、在庫を減らしたりする人」です。
お客さん(プレイヤー)が「バケツください!」と言うと、
- 今いくら持ってる?
- 在庫はいくつある?
を確認して、買えるかどうかの判断は ShopItemData に聞きます。
OKなら、
- お金を受け取る
- 在庫を減らす
- 商品を出す
という“実際の処理”を行います。レジ担当のお店の人というイメージです。
③ TeropUI =「画面に出るお知らせ」
これは、「結果をプレイヤーに見せる役」です。
たとえば
「バケツを購入しました!」
「お金が足りません(あと5円)」
「在庫切れです」
こういうメッセージを画面にポンっと出してくれます。
3つの流れをつなげるとこうなる
① プレイヤーがボタンを押す
↓
② ShopTerminal(レジの人)がチェック
↓
③ ShopItemData(商品カード)が判断
↓
④ TeropUI(お知らせ)が結果を表示
超かんたんに言うと
ShopItemData → 「商品そのもの」
ShopTerminal → 「買えるか確認する人」
TeropUI → 「結果を教えてくれる人」

なぜ分けているの?
今の形なら、
・商品を増やしたい→ 商品カードを増やすだけ
・メッセージを変えたい → 商品カードを編集するだけ
で済みます。
つまり、あとから処理量を増やしやすいショップになっています。
まとめ
今回のショップシステムは、
- 商品カード(ShopItemData)
- レジ係(ShopTerminal)
- お知らせ係(TeropUI)
の3つ一組のチームでできています。
こうして役割を分けておくから、仕組みがシンプルで、あとから楽ができます。プログラミング用語だと関心の分離/責務の分離などと呼ばれます。
こうした役割分離ができていないと後から機能追加したり修正するときにとても苦労してしまいます。プログラム設計を行う上で大事な考え方になります。

商品データ(ShopItemData)を作る
データスクリプトを用意しよう
まずはどのようなデータが必要か考えます。
このスクリプトが目指しているのは、ざっくり言うと以下です。
- 商品に「ID・名前・価格・在庫」を持たせる
- 購入時に
- 買えた / 買えないを判定できる(お金、在庫)
- 結果に応じたメッセージ(テロップ)を出せる
- 成功したら“何か”が起きる
- 物理アイテムならPrefabが出現 (バケツなど)
- 無形アイテムならゲーム内の機能を解放みたいな効果が発動 (種の所持数増など)
Projectウィンドウで Assets を開き、Scripts フォルダを開きます。
フォルダ内で右クリックして Create > MonoBehaviour Script を選択し、名前を「ShopItemData」にしましょう。

作成できたら、そのスクリプトをダブルクリックで開き、以下の内容を書き込んでください。
まとめ

Unityでお店システムを作りました。「種」や「バケツ」などのアイテムを購入できるようにしました。
今回はプレイヤーが経営者・農場主として必要なアイテムを購入できるお店でしたが、次の講座では、商品棚を作成し、実際にお客さんが買い物するためのお店システムを作成していきます。
畑で収穫した農作物(ニンジン)を実際に店頭に並べてお客さんに買ってもらい、得た収入でまた次の種を買う。そんなゲームの基本ループを構築していきます。
次の記事:

現場レベルのゲーム制作が、すべてここで学べます。







コメント