はじめに
こんにちは!今日は、Unityでオブジェクトが衝突したときに、特定のオブジェクトのスクリプトを非アクティブにする方法を紹介します。このテクニックは、例えばゲーム内でプレイヤーが障害物にぶつかった時に、特定のアクションを停止させたい場合に役立ちます。簡単な手順で実現できるので、一緒にやってみましょう!
具体的には常に動いている障害物(Sphere)があります。プレイヤー(Cube)がCapsuleに触れるとSphireの動きが止まるようにします。
ステップ1: オブジェクトの準備
まず、Unityのプロジェクトを開きます。そして、ヒエラルキー(Hierarchy)ウィンドウでオブジェクトを作成します。使用するオブジェクトは「Sphere」「Cube」「Capsule」です。
- ヒエラルキーウィンドウで右クリックします。
- 「3D Object」→「Sphere」「Cube」「Capsule」を選びます。
- 「Sphere」と「Cube」のaddConmonentからrigidbodyを検索してアタッチしてUseGravityの項目のチェックを外します。
- 「Capsule」のコライダーのIstriggerの項目にチェックを入れます
ステップ2: スクリプトの作成
次に、プレイヤーオブジェクトにアタッチするスクリプトを作成します。
- プロジェクトウィンドウで右クリックします。
- 「Create」→「C# Script」を選び、「CubeMove」と名前を付けます。
- スクリプトをダブルクリックして開き、以下のコードを入力します。
コード全体の説明
このスクリプトは、キューブを矢印キーで動かし、カプセルに触れたときにスフィアの動きを止めるというものです。
各部分の説明
- using UnityEngine;
- Unityの機能を使うための宣言です。
- public class CubeMove : MonoBehaviour
CubeMove
という名前のクラスを定義しています。このクラスは、UnityのMonoBehaviour
という基本クラスを継承しています。
- [SerializeField] GameObject sphere;
sphere
というゲームオブジェクトを定義しています。[SerializeField]
は、Unityエディタ上でこの変数を設定できるようにするためのものです。
- private float speed = 3.0f;
- キューブの移動速度を設定しています。この場合、速度は3.0fです。
- void Start()
- ゲームが始まったときに一度だけ呼ばれる関数です。ここでは、シーン内にある「Sphere」という名前のオブジェクトを探して
sphere
に代入しています。
- ゲームが始まったときに一度だけ呼ばれる関数です。ここでは、シーン内にある「Sphere」という名前のオブジェクトを探して
- void Update()
- 毎フレーム呼ばれる関数です。ここでキューブの移動を処理しています。
- float moveX = Input.GetAxis(“Horizontal”) * Time.deltaTime * speed;
- 水平方向の入力を取得し、時間経過と速度を掛け合わせて移動量を計算しています。
- float moveZ = Input.GetAxis(“Vertical”) * Time.deltaTime * speed;
- 垂直方向の入力を取得し、時間経過と速度を掛け合わせて移動量を計算しています。
- transform.position = new Vector3(transform.position.x + moveX, 0, transform.position.z + moveZ);
- 計算した移動量を使って、キューブの位置を更新しています。
- float moveX = Input.GetAxis(“Horizontal”) * Time.deltaTime * speed;
- 毎フレーム呼ばれる関数です。ここでキューブの移動を処理しています。
- void OnTriggerEnter(Collider other)
- 他のオブジェクトと衝突したときに呼ばれる関数です。
- if (other.gameObject.name == “Capsule”)
- 衝突したオブジェクトの名前が「Capsule」だった場合
- sphere.GetComponent<SphereMove>().enabled = false;
sphere
オブジェクトにアタッチされているSphereMove
スクリプトを無効化しています。
- if (other.gameObject.name == “Capsule”)
- 他のオブジェクトと衝突したときに呼ばれる関数です。
全体の動き
- ゲームがスタートすると、シーン内の「Sphere」を探します。
- 毎フレーム、矢印キーの入力に応じてキューブの位置を更新します。
- キューブがカプセルに触れると、スフィアの動きを止めます。
using UnityEngine;
public class CubeMove : MonoBehaviour
{
[SerializeField] GameObject sphere;
private float speed = 3.0f;
void Start()
{
sphere = GameObject.Find("Sphere");
}
void Update()
{
float moveX = Input.GetAxis("Horizontal") * Time.deltaTime * speed;
float moveZ = Input.GetAxis("Vertical") * Time.deltaTime * speed;
transform.position = new Vector3(
transform.position.x + moveX, 0, transform.position.z + moveZ
);
}
void OnTriggerEnter(Collider other)
{
if (other.gameObject.name == "Capsule")
{
sphere.GetComponent<SphereMove>().enabled = false;
}
}
}
Sphere(障害物)のスクリプト
次に、Sphere(障害物)にアタッチするスクリプトを作成します。
- プロジェクトウィンドウで右クリックします。
- 「Create」→「C# Script」を選び、「SphereMove」と名前を付けます。
- スクリプトをダブルクリックして開き、以下のコードを入力します。
コード全体の説明
このスクリプトは、スフィア(球体オブジェクト)を前後に動かし、100フレームごとに180度回転させます。
各部分の説明
- using System.Collections; using System.Collections.Generic; using UnityEngine;
- 必要なライブラリをインポートしています。
System.Collections
とSystem.Collections.Generic
はコレクション(リストや配列など)を使うためのものです。UnityEngine
はUnityの基本的な機能を使うためのものです。
- 必要なライブラリをインポートしています。
- public class SphereMove : MonoBehaviour
SphereMove
という名前のクラスを定義しています。このクラスは、UnityのMonoBehaviour
クラスを継承しています。
- private int counter = 0;
counter
という名前の整数型変数を定義しています。これは、スフィアが移動するフレーム数を数えるためのカウンターです。
- private float move = 5.0f;
move
という名前の浮動小数点型変数を定義しています。これは、スフィアの移動速度です。この場合、速度は5.0fです。
- void Update()
- 毎フレーム呼ばれる関数です。ここでスフィアの移動と回転を処理しています。
- transform.Translate(new Vector3(0, 0, move * Time.deltaTime));
- スフィアを前方向に移動させます。
move * Time.deltaTime
を使って、フレームレートに依存しない移動を実現しています。
- スフィアを前方向に移動させます。
- counter++;
- カウンターを1増やします。
- if (counter == 100)
- カウンターが100に達したとき
- counter = 0;
- カウンターをリセットします。
- transform.Rotate(new Vector3(0, 180, 0));
- スフィアをY軸を中心に180度回転させます。これでスフィアの進行方向が反転します。
- transform.Translate(new Vector3(0, 0, move * Time.deltaTime));
- 毎フレーム呼ばれる関数です。ここでスフィアの移動と回転を処理しています。
全体の動き
- 毎フレーム、スフィアは前方向に移動します。
- 100フレームごとにカウンターがリセットされ、スフィアは180度回転して進行方向を反転させます。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class SphereMove : MonoBehaviour
{
private int counter = 0;
private float move = 5.0f;
void Update()
{
transform.Translate(new Vector3(0, 0, move * Time.deltaTime));
counter++;
if (counter == 100)
{
counter = 0;
transform.Rotate(new Vector3(0, 180, 0));
}
}
}
ステップ3: スクリプトのアタッチ
作成したスクリプトをオブジェクトにアタッチします。
- 作成した「CubeMove」スクリプトを、ドラッグ&ドロップでCubeにアタッチします。
- 作成した「SphereMove」スクリプトをドラッグ&ドロップでSphereにアタッチします。
ステップ4: プレイヤーの動作確認
これで設定は完了です!CubeがCapsuleに衝突すると、Sphereの動きを制御しているスクリプトが非アクティブになります。
- プレイボタンを押してゲームを開始します。
- プレイヤーオブジェクトが障害物にぶつかると、プレイヤーが動かなくなることを確認します。
まとめ
以上で、Unityでオブジェクトが衝突したときにスクリプトを非アクティブにする方法の説明は終わりです。とても簡単ですよね!ぜひ試してみてください。ゲーム開発がもっと楽しくなるはずです!
おすすめのアセット
この「Bubble Shooter Game Toolkit」は、誰でも簡単に人気のバブルシューターゲームを作れるツールキットです。カラフルなバブルを使ったゲームの基本的な仕組みがすべて含まれており、初心者でも直感的に操作できます。