【Unity6】箱庭経営シミュレーション×農業ゲームの作り方 #7|商品棚・お客さんAI・NavMeshで来店購入システムを実装する | Unity入門の森 ゲームの作り方

【Unity6】箱庭経営シミュレーション×農業ゲームの作り方 #7|商品棚・お客さんAI・NavMeshで来店購入システムを実装する

Unity 箱庭経営シミュレーション×農場ゲームの作り方

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

【永久会員チケット】

永久会員チケット|Unity入門の森

全講座を見放題で学ぶ

ソースコード・素材・プロジェクトすべて公開。
Unityの基礎から応用まで、一生使えるスキルを体系的に習得。

この講座ではUnityを使って「箱庭経営シミュレーション×農業ゲーム」を作成していきます。
今回はその第7回目です。

前回はショッピングシステムを実装してバケツや種を購入できるようにしました。

前回の記事:

【Unity入門】箱庭経営シミュレーション×農場ゲームの作り方 #6|お店システムを実装する
この講座ではUnityを使って「箱庭経営シミュレーション×農場ゲーム」を作成していきます。今回はその第6回目です。前回はプレイヤーが畑を耕して種が成長してニンジンを収穫できる畑システムを開発しました。さらに種の所持数を追加し、畑を整地してリ...

前回はプレイヤーが農場経営に必要なアイテムを購入するお店システムでしたが、第7回ではお客さんが買い物に来てくれるお店システムを作ります。

商品棚を追加し、そこに収穫したにんじんを陳列することでお客さんが商品を買いに来るようにしてみましょう。

3DゲームでのルールベースAIエージェントの作成も行います。

【ゲームの作り方講座プレゼント中!】

Unityでショップの商品棚を作成しよう

まずは、商品棚として使用するオブジェクトを作成していきます。

はじめに、Hierarchy上で右クリックし、「Create Empty」を選択してください。作成された空のオブジェクトの名前を「ProductShelf_Group」に変更しましょう。

作成した「ProductShelf_Group」を選択し、InspectorのTransformを次のように設定しておきましょう。

次に、Projectウィンドウを開き、
AssetHuntsl > GameDev Starter Kit – Farming > Asset > Prop > Props_Crate_01
の順にフォルダをたどっていきます。

「Props_Crate_01」を見つけたら、それを先ほど作成した「ProductShelf_Group」にドラッグ&ドロップしてください(ProductShelf_Groupの子オブジェクトになるようにします)。

配置した「Props_Crate_01」を選択し、Ctrl + D を4回押して複製しましょう。

「Props_Crate_01 (4)」が生成されるまで複製できれば、合計で5個になります。

「Props_Crate_01」から「Props_Crate_01 (4)」までを、Shiftキーを押しながらまとめて選択しましょう。複数選択した状態で、InspectorのTransformを以下のように設定します。

Pos X = #*1.2-2.3とすればOKです(画像では#*1.2+-2.3となっていますがどちらでも同じ)。

続いて、当たり判定を追加していきます。

Hierarchyから「Props_Crate_01」の右側にある「>」をクリックし、Prefab編集モードに入りましょう。

画面が以下のようにPrefab専用の編集表示に切り替わっていれば、正しくPrefab編集モードに入れています。

「Props_Crate_01」を選択した状態で、Inspectorの「Add Component」をクリックしてください。表示された一覧から「Box Collider」を選択し、コンポーネントを追加しましょう。

今回、Props_Crate_01を5つコピーして使っていますが、それらの元となるプレハブを編集したのでコピー先のProps_Crate_01(1)~Props_Crate_01(4)にもBox Colliderが設定されます。

スクリプトから商品棚を作成しよう

今回作るのは、プレイヤーが商品を棚に陳列できるシステムです。
棚には複数の置き場(スロット)が用意されていて、そこに商品をきれいに並べられます。

イメージとしてはこんな感じです。

  • プレイヤーがアイテムを拾う
  • 棚を見ながらキーを押すと、空いている場所に商品がスッと置かれる(陳列)
  • 棚に置いた商品は「棚の子オブジェクト」になって、棚が商品を管理できる
  • 棚側の処理で「棚から商品を1個取り出す(購入扱いで消す)」こともできる

↑こうした機能をプレイヤーと商品棚両方のスクリプトの組み合わせで実現させます。

プレイヤー側(ItemInteractor)の仕組み

こちらは以前作成したItemInteractorに追記していきます。

プレイヤー側のスクリプトは、ざっくり言うと「今見ている対象」と「手に持っている物」から、「やるべき行動を自動で切り替える」役目です。

  • 画面中央(カメラ中心)からRayを飛ばして、目の前の対象を判定
  • 手にアイテムを持っていて、見ている先が棚なら「陳列」
  • さらに、状況に応じて操作案内(例:Eで陳列、Qでドロップ)を表示

つまり、プレイヤー操作の入口(E/Qの処理)を一括で管理しているスクリプトです。

商品棚側(ItemPlacementSurface)の仕組み

棚側のスクリプトは、「棚の空き場所を探して、そこに商品を置く」のがメインです。
棚には slots(置き場配列)があり、空いているスロットに順番に商品を入れていきます。
ItemPlacementSurfaceには以下のような関数を用意します。

  • TryGetPlaceSlot()
    空いているスロット(子がいない場所)を探して返す
  • PlaceItemToSlot()
    商品をスロットの位置へ移動し、スロットの子にする
    さらにTweenで“スッ”と置く演出も入る
  • onlyCrops がONなら、作物(CropItem)以外は置けない
  • TryTakeOneRandom()
    棚に置かれている商品をランダムで1つ取り出す(購入処理の入口)
    destroyOnTake=true なら、そのまま消えて「買われた扱い」になる

つまり棚側は、陳列の受け皿+在庫管理(棚に何個あるか、取り出せるか)を担当しています。

ItemBaseに「棚に置く」処理を用意しよう

これまで、アイテムを手に持つ・落とすといった挙動は、すべて ItemBase が管理していました。
プレイヤー操作側の ItemInteractor は、状況に応じて「ItemBaseの機能を呼び出す」役割でしたよね。

今回追加する 「棚に置く(陳列する)」 動きも、同じ考え方で進めます。
棚に置いたときの 位置合わせ や 物理挙動の切り替え などを ItemBase 側にまとめて実装しておけば、ItemInteractor や棚側スクリプトからは、必要なタイミングでそれを呼び出すだけで済みます。

ItemBase に、「棚に置かれたときの処理」を追加していきましょう。

Projectウィンドウから Scripts フォルダを開きItemBase を見つけたらダブルクリックして開きましょう。

開けたら、以下のマーカー部分を書き込んでください。

ItemBase.cs

※ItemPlacementSurfaceを作成していないためエラーになりますが、先のパートで作成するので現段階では問題ありません。

スクリプトの解説

このメソッドは、アイテムを棚などの設置場所に置いたときに呼ばれる処理です。
「手に持っている状態」から「棚に安定して置かれた状態」へ切り替える役割を持っています。

① 既存のTweenを停止する

拾う途中などで動いているアニメーションがあれば、ここで必ず停止します。
これをしないと、古いTweenが残って不自然な動きをしてしまう可能性があります。

② 親オブジェクトを棚に変更する

このアイテムを、棚(ItemPlacementSurface)の子オブジェクトにします。
これにより、棚の管理下に入る状態になります。

worldPositionStays: true にしているため、ワールド座標は維持したまま親だけ変更されます。

③ 物理を停止する

棚に置いたアイテムは、物理演算で落ちたり動いたりしてはいけません。
そのため、

  • isKinematic を true にして物理の影響を止める
  • 重力を無効にする

という処理を行っています。

④ コライダーをONに戻す

手に持っているときはコライダーをOFFにしていました。
棚に置いたら、再び当たり判定を有効にします。
これによって、プレイヤーが再び拾える(レイキャストが当たる)ようになります。

⑤ レイヤーを元に戻す

手に持っている間は「Hand」レイヤーに変更していました。
棚に置いたら、元のレイヤーに戻します。これにより、最前面に表示していた状態が戻ります。
↓もしこれをしなかったら…

↑このように以前作成したカメラ最前面に表示させる処理が動いたままになってしまいます。

⑥ 指定位置へアニメーション移動

最後に、棚の指定位置と回転へ、ふわっと移動させています。

  • DOMove でワールド座標へ移動
  • DORotateQuaternion で回転を合わせる
  • placeEase で動きの滑らかさを調整

これによって、「スッ」と棚に並ぶ自然な演出が実現されています。

まとめ

OnPlaced は、

  1. 古いアニメーションを止める
  2. 親を棚に変更する
  3. 物理を止める
  4. コライダーを戻す
  5. レイヤーを戻す
  6. 指定位置へ滑らかに移動させる

という流れで、“持っている状態”から“棚にきれいに置かれた状態”へ切り替えるメソッドです。
操作側は「棚に置く」という命令を出すだけで、実際の細かい制御はすべて ItemBase が担当するという設計になっています。

商品棚側のスクリプトを作成しよう

次は商品棚のスクリプトを作成していきましょう。

まず、Projectウィンドウから Scripts フォルダを開きます。
フォルダ内で右クリックし、Create > MonoBehaviour Scriptを選択してください。
新しく作成されたスクリプトの名前を「ItemPlacementSurface」 に変更しましょう。

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

続きを読む
このコンテンツはパスワードで保護されています。 コンテンツを読みたい方はUnity入門の森ショップ(https://unityforest.shop/)で講座閲覧権を取得してね。

まとめ

今回はNavMeshエージェントなどを活用し、

  • 作成した商品棚に農作物を配置し
  • お客さんが来店して購入していく

という仕組みまで実装しました。

これにより「農場で作物を育てる → お店に商品を並べる → 商品が売れる」という一連の流れが完成しました。

現状は「作物を育てて売るシンプルな経営ゲーム」という形になっています。このままだとゲームとしては少し単調です。

そこで、次回の講座ではゲーム性を広げるための“妨害要素”を追加していきます。

単に売るだけではなく思い通りにいかない状況を作り上げ、プレイヤーの判断が問われるトラブル展開を取り入れます。

これによりさらにゲームらしい体験に発展させていきます。

次の記事:

Unityで農園シミュレーションゲームを作ろう【第8回】 ハエが作物を腐らせる妨害システムと虫よけスプレーを実装する
この講座ではUnityを使って「箱庭経営シミュレーション×農場ゲーム」を作成していきます。今回はその第8回目です。前回は商品棚を作成してお客さんが商品を購入してくれるようにしました。前回の記事:これまでで農園経営シミュレーションゲームの基盤...

【ゲームの作り方講座もプレゼント中!】

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

【永久会員チケット】

永久会員チケット|Unity入門の森

全講座を見放題で学ぶ

ソースコード・素材・プロジェクトすべて公開。
Unityの基礎から応用まで、一生使えるスキルを体系的に習得。

コメント

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