はじめに
ゲームを作るとき、「特定のオブジェクトだけクリックで削除できる」「他のオブジェクトは削除されない」といった仕組みを作りたいことがありますよね。例えば、宝箱をクリックしたら中身が消えるけど、背景の岩や木はそのままにしたい…そんなシチュエーションです!
この記事では、Unityを使って、クリックで削除できるオブジェクトと、クリックしても削除できないオブジェクトを簡単に作る方法を解説します。CubeとSphereは削除できるようにし、CylinderとCapsuleは削除できないように設定します。
この方法をマスターすれば、オブジェクトの管理がもっと簡単になりますし、ゲームの仕組みをカスタマイズする力もつきます!初心者向けに優しく解説するので、Unityの基本操作がわかる方なら誰でもできる内容です。さあ、実際に手を動かしてみましょう!
Unityを触ったことがないという方はコチラの記事から見てみてください!
1.完成イメージ
シーンには4つのオブジェクトが配置されています。それぞれのオブジェクトがどのように動作するかは以下の通りです。
1. クリックで削除可能なオブジェクト
- Cube: プレイヤーがクリックすると、シーンから削除されます。
- Sphere: 同じく、クリックで削除されます。
2. クリックしても削除できないオブジェクト
- Cylinder: クリックしても削除されません。そのまま残ります。
- Capsule: 同じく、クリックしても削除されません。
2. シーンをセットアップする
1.オブジェクトを配置
- Hierarchyウィンドウで以下の手順を実行します:
- オブジェクトの作成
Hierarchyウィンドウで右クリック → 「3D Object」→「Cube」を選択。Cubeがシーンに追加されます。 - 「Sphere」「Cylinder」「Capsule」も同様の手順で作成します。
- オブジェクトの作成
2. オブジェクトの整理
- 各オブジェクトが見やすいように配置します。
- Cube, Sphere, Cylinder, Capsuleをそれぞれ少し離れた位置に移動。
- 移動するには、Hierarchyウィンドウでオブジェクトをクリックし、「Inspector」ウィンドウで「Transform」の「Position」値を変更します。
例: Cubeの位置を (-2, 0, 0)、Sphereを (0, 0, 0)、Cylinderを (2, 0, 0)、Capsuleを (4, 0, 0) に設定。
3. Colliderの確認
- すべてのオブジェクトにColliderが自動で付いていますが、もしColliderがない場合は追加してください。
- Inspectorで確認:各オブジェクトを選択し、「Box Collider」「Sphere Collider」などが表示されているか確認。
- ない場合の追加方法:Inspectorの「Add Component」ボタンをクリック → 「Collider」と検索して適切なCollider(CubeにはBox Colliderなど)を選択して追加。
4. タグの設定
- 削除可能にするオブジェクト(CubeとSphere)を選択します。
- インスペクターの上部にある「Tag」から「Add Tag…」を選択。
- 「Destroy」という新しいタグを作成します。
- CubeとSphereに「Destroy」タグを設定します。
4. スクリプトの作成
次に、クリックで削除するためのスクリプトを作成します。以下の手順に従って進めましょう!
1. 新しいスクリプトの作成
- プロジェクトウィンドウを右クリックして「Create」→「C# Script」を選択します。
- スクリプトの名前を「ObjectDestroy」と付けます。
2. スクリプトを編集
- 作成したスクリプトをダブルクリックして開きます。
- 以下のコードをコピーして貼り付けます。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ObjectDestroy : MonoBehaviour
{
void Update ()
{
// カメラからマウス位置に向けてRay(光線)を発射
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
// Rayが当たった情報を格納する変数
RaycastHit hit;
// マウスの左クリックを検知
if (Input.GetMouseButtonDown(0))
{
// Rayがオブジェクトに当たったかどうかチェック
if (Physics.Raycast(ray, out hit))
{
// 当たったオブジェクトのタグが"Destroy"なら削除
if (hit.collider.gameObject.tag == "Destroy")
{
Destroy(hit.collider.gameObject);
}
}
}
}
}
3. このスクリプトが何をしているか
- Updateメソッド
毎フレーム、プレイヤーのマウス位置を取得してRay(光線)を発射します。 - Raycast(光線)を使ってオブジェクトを検知
マウスの左クリック(Input.GetMouseButtonDown(0)
)がされた時、Rayが当たったオブジェクトを取得します。 - タグが「Destroy」のオブジェクトのみ削除
if (hit.collider.gameObject.tag == "Destroy")
でタグをチェックし、該当するオブジェクトを削除します。
1. Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
- 何をしている?
- マウスの位置からカメラ方向へ「光線」を飛ばします。
- どう動く?
Input.mousePosition
でマウスの位置を取得します。Camera.main.ScreenPointToRay()
を使って、その位置からRayを生成します。
2. RaycastHit hit;
- 何をしている?
- Rayが何かに当たったときの情報を入れるための「入れ物」を用意しています。
- どう動く?
- この変数の中に、光線が当たったオブジェクトの位置やそのオブジェクト自体などの情報が保存されます。
3. if (Input.GetMouseButtonDown(0))
- 何をしている?
- マウスの左クリックを検知しています。
Input.GetMouseButtonDown(0)
は「左クリックが押された瞬間」を教えてくれます。
4. if (Physics.Raycast(ray, out hit))
- 何をしている?
- 飛ばしたRayが何かに当たったかを確認しています。
Physics.Raycast()
は「Rayが当たったかどうか」をチェックします。out hit
は「もし当たったらその情報をhit
変数に入れる」という意味です。
5. if (hit.collider.gameObject.tag == "Destroy")
- 何をしている?
- 当たったオブジェクトのタグが「Destroy」かどうかを確認しています。
hit.collider.gameObject
で当たったオブジェクトを取得し、そのタグをチェックします。
6. Destroy(hit.collider.gameObject);
- 何をしている?
- 当たったオブジェクトを削除しています。
Destroy()
関数を使うことで、ゲーム内からそのオブジェクトを消します。
スクリプト全体の動き
- プレイヤーがゲーム画面を左クリックすると、スクリプトが毎フレーム実行される
Update
関数でクリックを検知します。 - カメラからマウスの位置に向けて光線(Ray)を飛ばします。
- 光線がオブジェクトに当たったら、そのオブジェクトが「Destroy」タグを持っているか確認します。
- タグが「Destroy」の場合、そのオブジェクトを削除します。
4. スクリプトをアタッチ
- スクリプトをカメラ(
Main Camera
)などにドラッグ&ドロップしてアタッチします。
これで準備完了です!
5. シーンをプレイして動作確認
- 再生ボタン(Play)を押す
- Unityエディタ上部の「再生ボタン(▶)」をクリックして、シーンを再生します。
- クリックしてオブジェクトを確認
- CubeまたはSphereをクリックしてみましょう。オブジェクトが瞬時に削除されれば成功です!
- 次に、CylinderとCapsuleをクリックしてみましょう。クリックしても何も起こらないことを確認してください。
これで、シーンをプレイしてオブジェクトの動作を確認する手順は完了です!
よくある質問(Q&A)
- Qスクリプトをアタッチしたのにオブジェクトが削除されません。
- A
スクリプトが正しくアタッチされているか確認してください。また、オブジェクトがColliderを持っていることも確認してください。
- Q削除不可のオブジェクトにメッセージを表示させる方法は?
- A
OnMouseDownメソッド内でDebug.Logを使う、またはUIを表示するコードを追加すると実現できます。
- Qクリックではなく、特定のキーを押した時に削除するには?
- A
Input.GetKeyDown(KeyCode.KeyName)を使用して実現できます。