Unity 6でアイテムを取得する方法|Is TriggerとC#で触れたら消す仕組みを作る

Unity 6でIs TriggerとC#を使ってアイテム取得処理を作る初心者向け記事のアイキャッチ画像 Unity

前回は、Unity 6のゲームエリア内にCubeを使った障害物を配置し、Materialを設定してGround・壁・障害物を見分けやすくしました。

今回は、ゲームエリアの中にPlayerが取得できるアイテムを配置します。

Playerがアイテムに触れると、

Playerがアイテムに接触する

取得したことを判定する

アイテムが消える

という簡単な仕組みを作ります。

ここではColliderのIs Triggerという機能を使用します。

さらに、今回もAIに相談しながらアイテム取得用のC#スクリプトを作成し、実際にUnityで動作するか確認していきます。

前回の障害物とMaterialの設定についてはこちらの記事で解説しています。

Unity 6で障害物を配置する方法|CubeとMaterialでゲームエリアを作る

今回作るアイテムについて

今回は、ゲームエリア内にシンプルな取得アイテムを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

程度にすると、小さなアイテムらしく見えます。

位置については障害物と重ならなければ多少違っていても問題ありません。

Unity 6でSphereをItemとしてゲームエリア内に配置した画面
Sphereの名前をItemに変更し、ゲームエリア内に配置します。

Item用のMaterialを作成する

Itemをそのまま使用すると他のGameObjectと見分けにくいため、専用のMaterialも作成します。

前回作成した、

Materials

フォルダ内に新しいMaterialを作成します。

名前は、

ItemMaterial

にします。

今回は取得アイテムとして目立つように、黄色や明るい色にしてみます。

作成したItemMaterialをItemへ設定します。

これでゲームエリアの中でもItemを見つけやすくなります。

UnityでItemMaterialを作成してItemの色を変更した画面
ItemMaterialを作成し、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

にします。

UnityのItemでSphere ColliderのIs Triggerを有効にした画面
ItemのSphere ColliderでIs Triggerを有効にし、Playerとの接触を検出できるようにします。

これによってPlayerはItemに押し返されず、Itemと重なったタイミングをC#スクリプトから検出できるようになります。

PlayerにPlayerタグを設定する

今回のC#スクリプトでは、

Itemに触れたGameObjectがPlayerなのか

を判定します。

そのため、Playerに

Player

タグを設定します。

HierarchyでPlayerを選択し、Inspector上部にあるTagを確認します。

TagがUntaggedになっている場合は、

Player

へ変更します。

UnityでPlayerのTagをPlayerに設定した画面
PlayerのTagを「Player」に設定し、スクリプトから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#スクリプトを作ってください。

ChatGPTにUnity 6のアイテム取得スクリプトを質問した画面
PlayerがItemに触れたら削除する方法をChatGPTに質問します。

前回と同じように、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);
        }
    }
}
UnityでPlayerがItemに触れたら削除するItemPickupのC#コード
AIが提案したItemPickupスクリプトを作成し、Playerとの接触時にItemを削除します。

コードは短いですが、今回のアイテム取得に必要な処理が入っています。

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になっていることも、もう一度確認しておきます。

UnityでItemにItemPickupスクリプトを追加した画面
ItemにItemPickupスクリプトを追加し、Sphere ColliderのIs Triggerが有効になっていることを確認します。

PlayモードでItemを取得する

設定が終わったらPlayボタンを押します。

Gameビューをクリックして、W・A・S・DキーでPlayerをItemへ移動させます。

PlayerがItemに触れると、

Itemがゲーム画面から消える

はずです。

さらにConsoleを確認すると、

Item collected!

と表示されます。

UnityでPlayerがItemを取得しConsoleにItem collectedと表示された画面
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の行動を画面上の情報へ反映する仕組みを作っていきます。

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