UnityUnityメモ

Unityで領域に入るとオブジェクトの色が変わる仕組みを作ろう!簡単なスクリプト解説

Unity

はじめに

こんにちは!Unityでゲームを作りたいけど、どうやってオブジェクトの見た目を変えればいいのか悩んだことはありませんか?特に、「キャラクターが特定のエリアに入ると色が変わる」という仕組みは、ゲームの演出や視覚的なフィードバックに役立ちます。

本記事では、Unityを使って、オブジェクトが特定のエリアに入ったときに色を変更し、エリアを出たときに元の色に戻す方法を解説します。具体的には、簡単なスクリプトを作成して、この動きを実現していきます。

この仕組みを使えば、例えばこんなことができます:

  • キャラクターが危険ゾーンに入ると色が赤に変わる
  • 回復エリアに入ったら色が緑に変わる
  • エリアを出ると元の色に戻る

Unity初心者の方でも、ステップバイステップで進めれば問題なく完成させられる内容です。さあ、実際に一緒に作っていきましょう!

Unityを触ったことがないという方はコチラの記事から見てみてください!



1.シーンのセットアップ

3Dプロジェクトを開いたら必要なオブジェクトを配置していきます。

床の配置

  1. ヒエラルキー(Hierarchy)ウィンドウで右クリックします。
  2. 「3D Object」→「Plane」を選択します。
  3. 作成されたPlaneを選択し、インスペクターでScaleを調整してステージを広げます(任意)

プレイヤーオブジェクトの作成

  1. 再度、ヒエラルキーで右クリックして「3D Object」→「Sphere」を選択します(Sphereをプレイヤーオブジェクトとして使用します)。
  2. 作成されたSphereの位置をY=0.5に設定して、ステージの中央より左のあたりに配置します。
  3. Sphereの名前を「Player」に変更します。

物理特性を追加

  1. インスペクター画面の「AddComponent」ボタンをクリックします。
  2. 「Rigidbody」を検索して追加します。

色を変更する範囲の作成

  1. ヒエラルキーで右クリックして「3D Object」→「Cube」を選択します。
  2. 作成されたキューブをステージ上に配置します。
  3. インスペクターでキューブのTransformを調整して、適当な位置に移動させます。

オブジェクトの設定

  1. BoxColliderの「Is Trigger」オプションにチェックを入れます。

色の設定

  1. プロジェクトウィンドウを右クリック、「Create」→「Material」を選択します。
  2. インスペクター画面から色を透明に設定します。
  3. Materialを「Cube」にアタッチします。



2. スクリプトの作成

スクリプトを作成し、プレイヤーオブジェクトの色を変える処理を追加します。

スクリプトファイルの作成

  1. プロジェクト(Project)ウィンドウを右クリックします。
  2. 「Create」→「C# Script」を選択します。
  3. 作成されたスクリプトに「ColorChanger」という名前を付けます。

スクリプトの編集

  1. 作成したColorChangerスクリプトをダブルクリックして開きます(Visual Studioなどのエディタが開きます)。
  2. 以下のコードをコピーして貼り付けます。

Updateメソッド

void Update()
{
float dx = Input.GetAxis("Horizontal") * Time.deltaTime * 3.0f;
float dz = Input.GetAxis("Vertical") * Time.deltaTime * 3.0f;
transform.position = new Vector3(transform.position.x + dx, 0.5f, transform.position.z + dz);
}
  • 何をしている? この部分は、プレイヤーが矢印キーやWASDキーを押したときに、オブジェクトを動かしています。
  • 詳しい解説
    1. Input.GetAxis("Horizontal"): 水平方向の入力(左・右、またはA・Dキー)を取得します。
    2. Input.GetAxis("Vertical"): 垂直方向の入力(上・下、またはW・Sキー)を取得します。
    3. Time.deltaTime: フレームレートに関係なく動きを滑らかにするために使います。
    4. 3.0f: 移動速度を調整しています。この数値を大きくすると速く動き、小さくするとゆっくり動きます。
    5. transform.position: 現在の位置を基準に新しい位置を計算しています。
    オブジェクトはX軸とZ軸方向に動きますが、Y軸の高さ(0.5)は固定されています。

OnTriggerStayメソッド

private void OnTriggerStay(Collider other)
{
if (other.gameObject.name == "Cube")
{
GetComponent<Renderer>().material.color = Color.yellow;
}
}
  • 何をしている? オブジェクトが名前が”Cube”のゲームオブジェクトのコライダー内にいる間、色を黄色に変えています。
  • 詳しい解説
    1. OnTriggerStay(Collider other): トリガー(Trigger)領域に他のオブジェクトが入っていると毎フレーム呼び出される関数です。
    2. if (other.gameObject.name == "Cube"): トリガー内のオブジェクトの名前が”Cube”であるか確認しています。
    3. GetComponent<Renderer>().material.color = Color.yellow;: このオブジェクトの見た目(Renderer)の色を黄色に変えています。

OnTriggerExitメソッド

private void OnTriggerExit(Collider other)
{
if (other.gameObject.name == "Cube")
{
GetComponent<Renderer>().material.color = Color.blue;
}
}
  • 何をしている? オブジェクトがトリガー領域から出たときに、色を青に戻しています。
  • 詳しい解説
    1. OnTriggerExit(Collider other): 他のオブジェクトがトリガー領域から出た瞬間に呼び出される関数です。
    2. if (other.gameObject.name == "Cube"): トリガーから出たオブジェクトの名前が”Cube”か確認します。
    3. GetComponent<Renderer>().material.color = Color.blue;: このオブジェクトの色を青に変更します。

3. 全体の流れ

  1. プレイヤーが矢印キーやWASDキーで動くと、Updateメソッドでオブジェクトの位置が変更されます。
  2. オブジェクトが”Cube”という名前のエリア(トリガー)に入ると、OnTriggerStayが発動し、色が黄色に変わります。
  3. トリガーから離れると、OnTriggerExitが発動し、色が青に戻ります。

4. 実行するための準備

このスクリプトを使うには以下を確認しましょう:

  1. このスクリプトを動かしたいオブジェクト(たとえばSphere)にアタッチします。
  2. アタッチしたオブジェクトにRigidbodyコンポーネントが必要です(isKinematicをオンにしておきましょう)。
  3. “Cube”という名前のゲームオブジェクトにトリガーのコライダーを設定します(Is Triggerをチェック!)。
using UnityEngine;

public class ColorChanger : MonoBehaviour
{
    void Update()
    {
        float dx = Input.GetAxis("Horizontal") * Time.deltaTime * 3.0f;
        float dz = Input.GetAxis("Vertical") * Time.deltaTime * 3.0f;
        transform.position = new Vector3(transform.position.x + dx, 0.5f, transform.position.z + dz);
    }

    private void OnTriggerStay(Collider other)
    {
        if (other.gameObject.name == "Cube")
        {
            GetComponent<Renderer>().material.color = Color.yellow;
        }
    }

    private void OnTriggerExit(Collider other)
    {
        if (other.gameObject.name == "Cube")
        {
            GetComponent<Renderer>().material.color = Color.blue;
        }
    }
}

4. スクリプトのアタッチ

  1. ヒエラルキーウィンドウで「Player」を選択します。
  2. プロジェクトウィンドウから作成したColorChangerスクリプトを、Playerオブジェクトにドラッグ&ドロップします。
  3. スクリプトがPlayerオブジェクトにアタッチされていることを確認します。



3.実行と確認

  1. プレイモードに入る
    Unityエディター上部の「再生ボタン」をクリックして、プレイモードを開始します。
  2. キャラクターを動かす
    矢印キーや「W」「A」「S」「D」キーでキャラクターを移動させます。
  3. 動作を確認する
    • キューブに触れると色が黄色に変わります。
    • キューブから離れると色が青色に戻ります。

これでスクリプトが正しく動作していることを確認できます!もし動かない場合は、スクリプトの設定コライダーの状態を見直してください。



よくある質問(Q&A)

Q
OnTriggerStayやOnTriggerExitが動作しません。どうすればいいですか?
A

キューブに「Is Trigger」が有効になっているか確認してください。また、キャラクターとキューブに適切なコライダーがアタッチされていることを確認してください。

Q
色の変更を他の条件で行うことは可能ですか?
A

もちろん可能です!他の条件をif文で指定すれば、トリガー以外の方法でも色を変更できます。

Q
他の色を使用したい場合、どう変更すればよいですか?
A

スクリプト内のColor.yellowColor.blueを、好きな色に変更してください。