前回は、Unity 6のゲームエリア内にCubeを使った障害物を配置し、Materialを設定してGround・壁・障害物を見分けやすくしました。
今回は、ゲームエリアの中にPlayerが取得できるアイテムを配置します。
Playerがアイテムに触れると、
Playerがアイテムに接触する
↓
取得したことを判定する
↓
アイテムが消える
という簡単な仕組みを作ります。
ここではColliderのIs Triggerという機能を使用します。
さらに、今回もAIに相談しながらアイテム取得用のC#スクリプトを作成し、実際にUnityで動作するか確認していきます。
前回の障害物とMaterialの設定についてはこちらの記事で解説しています。
Unity 6で障害物を配置する方法|CubeとMaterialでゲームエリアを作る
- 今回作るアイテムについて
- アイテムとしてSphereを作成する
- Item用のMaterialを作成する
- Is Triggerとは?
- PlayerにPlayerタグを設定する
- AIにアイテム取得コードを質問する
- AIが生成したコードを確認する
- OnTriggerEnterとは?
- CompareTagでPlayerか確認する
- Debug.Logで取得を確認する
- DestroyでItemを削除する
- ItemPickupスクリプトを作成する
- ItemにItemPickupを追加する
- PlayモードでItemを取得する
- Triggerが反応しない場合
- ColliderとTriggerの違い
- アイテム取得はゲーム制作の基本になる
- 今回のまとめ
- 次回はアイテムを複数配置してスコアを追加する
今回作るアイテムについて
今回は、ゲームエリア内にシンプルな取得アイテムを1つ配置します。
まだ本格的な3Dモデルは使用せず、Unityに用意されている
Sphere
をアイテムとして使用します。
作成したSphereには、
Item
という名前を付けます。
PlayerがItemに触れるとItemが消えるようにします。
今回の目標は、
- ゲームエリア内にItemを配置する
- ColliderのIs Triggerを有効にする
- PlayerにPlayerタグを設定する
- AIにアイテム取得コードを作ってもらう
- ItemPickupスクリプトを作成する
- PlayerがItemに触れたことを検出する
- 取得したItemを消す
という流れです。
アイテムとしてSphereを作成する
まずはゲームエリア内にアイテムを配置します。
Hierarchyから3D ObjectのSphereを作成します。
作成したSphereの名前を、
Item
に変更します。
今回はPlayerから少し離れた場所に配置します。
例えばTransformを、
Position X = 3
Position Y = 0.75
Position Z = -2
にします。
Scaleは、
X = 0.5
Y = 0.5
Z = 0.5
程度にすると、小さなアイテムらしく見えます。
位置については障害物と重ならなければ多少違っていても問題ありません。

Item用のMaterialを作成する
Itemをそのまま使用すると他のGameObjectと見分けにくいため、専用のMaterialも作成します。
前回作成した、
Materials
フォルダ内に新しいMaterialを作成します。
名前は、
ItemMaterial
にします。
今回は取得アイテムとして目立つように、黄色や明るい色にしてみます。
作成したItemMaterialをItemへ設定します。
これでゲームエリアの中でもItemを見つけやすくなります。

Is Triggerとは?
Sphereには最初から
Sphere Collider
が設定されています。
通常のColliderでは、PlayerがColliderにぶつかると物理的に押し返されます。
しかしアイテムの場合は、Playerがぶつかって止まるのではなく、
Playerがアイテムの中に入る
↓
触れたことだけを検出する
という動作にしたい場合があります。
そこで使用するのが、
Is Trigger
です。
ColliderのIs Triggerを有効にすると、そのColliderを通常の壁のような衝突として使うのではなく、GameObjectが入ってきたことを検出するためのTriggerとして使用できます。
今回はItemのSphere Colliderで、
Is Trigger = ON
にします。

これによってPlayerはItemに押し返されず、Itemと重なったタイミングをC#スクリプトから検出できるようになります。
PlayerにPlayerタグを設定する
今回のC#スクリプトでは、
Itemに触れたGameObjectがPlayerなのか
を判定します。
そのため、Playerに
Player
タグを設定します。
HierarchyでPlayerを選択し、Inspector上部にあるTagを確認します。
TagがUntaggedになっている場合は、
Player
へ変更します。

ここで重要なのは、
GameObjectの名前が「Player」であること
と、
Tagが「Player」であること
は別の設定だということです。
今回のスクリプトではTagを使って判定するため、Playerタグが正しく設定されていることを確認します。
AIにアイテム取得コードを質問する
ここから今回もAIを使用します。
例えばChatGPTに次のように質問します。
Unity 6で3Dゲームを作っています。
PlayerにはRigidbodyとColliderがあります。
SphereをItemとして使用し、Sphere ColliderのIs TriggerをONにしています。
PlayerがItemに触れたら、Consoleに「Item collected!」と表示してItemを削除したいです。
PlayerのTagは「Player」です。
初心者でも分かるシンプルなC#スクリプトを作ってください。

前回と同じように、AIへ質問するときは現在のUnityの状態を具体的に伝えます。
今回の場合は、
PlayerにRigidbodyがある
ItemのIs TriggerがON
Playerタグを使う
接触したらItemを削除する
といった条件を伝えています。
条件を具体的に書くことで、目的に合ったコードを生成してもらいやすくなります。
AIが生成したコードを確認する
今回は、次のようなシンプルなコードを使用します。
using UnityEngine;
public class ItemPickup : MonoBehaviour
{
private void OnTriggerEnter(Collider other)
{
if (other.CompareTag("Player"))
{
Debug.Log("Item collected!");
Destroy(gameObject);
}
}
}

コードは短いですが、今回のアイテム取得に必要な処理が入っています。
OnTriggerEnterとは?
今回のコードで重要なのが、
private void OnTriggerEnter(Collider other)
です。
OnTriggerEnterは、別のColliderがTriggerの中へ入ったときにUnityから呼び出されます。
今回の場合、
PlayerがItemのTriggerへ入る
↓
OnTriggerEnterが実行される
という流れになります。
otherには、Itemへ入ってきたColliderの情報が渡されます。
CompareTagでPlayerか確認する
次に、
if (other.CompareTag("Player"))
で、触れたGameObjectがPlayerかどうかを確認しています。
Playerには先ほどPlayerタグを設定しました。
そのため、Player以外のGameObjectがItemへ触れた場合には取得処理を実行しません。
ゲームが複雑になってくると、敵や障害物などさまざまなColliderが存在するため、「何が触れたのか」を判定することが重要になります。
Debug.Logで取得を確認する
PlayerがItemに触れた場合、
Debug.Log("Item collected!");
が実行されます。
Debug.Log()を使うと、UnityのConsoleへメッセージを表示できます。
今回は、
Item collected!
と表示します。
ゲーム画面だけでなくConsoleでも処理が実行されたことを確認できるため、開発中の動作確認に便利です。
DestroyでItemを削除する
最後に、
Destroy(gameObject);
を実行します。
Destroy()はGameObjectを削除するために使用します。
今回このスクリプトはItem自身に設定するため、
gameObject
はItem自身を表します。
つまり、
PlayerがItemに触れる
↓
Playerタグを確認する
↓
Consoleにメッセージを表示する
↓
Item自身を削除する
という処理になります。
ItemPickupスクリプトを作成する
前回までと同じように、
Assets → Scripts
フォルダ内に新しいC#スクリプトを作成します。
名前は、
ItemPickup
にします。
作成したItemPickupを開いて、AIが生成したコードを入力します。
保存したらUnityへ戻り、Consoleにエラーが表示されていないことを確認します。
C#スクリプトのファイル名とクラス名は、
ItemPickup
で一致させておきます。
ItemにItemPickupを追加する
スクリプトを作成しただけでは、まだItemでは実行されません。
HierarchyでItemを選択して、
ItemPickup
スクリプトをComponentとして追加します。
Itemには最終的に、
- Transform
- Mesh Renderer
- Sphere Collider
- ItemPickup
などが設定された状態になります。
Sphere Colliderの
Is Trigger
がONになっていることも、もう一度確認しておきます。

PlayモードでItemを取得する
設定が終わったらPlayボタンを押します。
Gameビューをクリックして、W・A・S・DキーでPlayerをItemへ移動させます。
PlayerがItemに触れると、
Itemがゲーム画面から消える
はずです。
さらにConsoleを確認すると、
Item collected!
と表示されます。

この2つを確認できれば、今回のアイテム取得処理は成功です。
Playモードを停止するとItemは元の状態に戻ります。
これはPlayモード中に行われた変更が、通常はSceneへ保存されないためです。
Triggerが反応しない場合
PlayerがItemへ触れても何も起こらない場合は、設定を確認します。
まずItemのSphere Colliderで、
Is Trigger = ON
になっているか確認します。
次にPlayerに、
Collider
Rigidbody
が設定されていることを確認します。
さらにPlayerのTagが、
Player
になっているか確認してください。
Itemに、
ItemPickup
スクリプトが追加されていることも確認します。
また、Consoleに赤いエラーが出ている場合は、そのエラーを確認します。
AIを利用している場合は、エラーメッセージと現在のコードをAIへ伝えることで原因を調べることもできます。
ColliderとTriggerの違い
通常のColliderとTriggerの違いを整理します。
| 設定 | 主な用途 |
|---|---|
| Is Trigger OFF | 壁や障害物など、物理的にぶつかる |
| Is Trigger ON | 接触や侵入を検出する |
例えば今回までに作成した壁や障害物では、
Is Trigger = OFF
になっています。
そのためPlayerは壁や障害物を通り抜けません。
一方、今回のItemでは、
Is Trigger = ON
にします。
そのためPlayerを物理的に止めるのではなく、PlayerがItemへ触れたことを検出できます。
同じColliderでも、Is Triggerの設定によって用途を変えることができます。
アイテム取得はゲーム制作の基本になる
今回作った仕組みは非常にシンプルですが、さまざまなゲームに応用できます。
例えば、
コインを取得する
回復アイテムを取得する
鍵を拾う
チェックポイントへ入る
ゴール地点へ到達する
といった処理にもTriggerを利用できます。
最初は「触れたら消える」だけですが、ここからスコアや所持数などを追加することで、ゲームとしての仕組みを増やしていくことができます。
今回のまとめ
今回はUnity 6でSphereを使った取得アイテムを作成しました。
Sphere ColliderのIs Triggerを有効にすることで、Playerを物理的に止めるのではなく、PlayerがItemへ触れたことを検出できるようにしました。
さらにAIに相談しながらItemPickupスクリプトを作成し、OnTriggerEnter()とCompareTag()を使ってPlayerとの接触を判定しました。
PlayerがItemへ触れると、Consoleへメッセージを表示し、Destroy()によってItemを削除します。
今回から、単にGameObjectを配置するだけではなく、Playerの操作によってゲーム内の状態が変化する仕組みが加わりました。
次回はアイテムを複数配置してスコアを追加する
今回はItemを1つだけ配置しました。
次回はItemを複数配置し、取得した数を数えられるようにします。
例えば、
Score: 0
↓
アイテムを1つ取得
↓
Score: 1
のように、ゲーム画面へスコアを表示します。
ここではUIやTextMeshProなども使いながら、Playerの行動を画面上の情報へ反映する仕組みを作っていきます。

