UnityUnityメモ

Unity初心者向け!クリックでカラーを取得&オブジェクト適用する方法

Unity

1. はじめに

今回の記事では、「オブジェクトのカラーを取得して、他のオブジェクトに適用する」という、方法を紹介していきます。

例えば、プレイヤーがクリックしたオブジェクトの色を別のオブジェクトに適用するような仕組みは、アイテムシステムや環境のカスタマイズなど、さまざまなゲームで応用可能です。この方法を学ぶことで、Unityのスクリプトやオブジェクトの扱いに慣れつつ、自分のゲームにちょっとした工夫を取り入れることができるようになります。

この記事では、具体的な手順とコードを交えて、初心者の方にもわかりやすく解説していきますので、一緒に楽しみながら進めていきましょう!

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



2. 必要な準備

この記事では、クリックでオブジェクトのカラーを取得し、それを別のオブジェクトに適用する仕組みを作ります。まずは、基本となるシーンの準備を進めましょう。


2-1. シーンにCubeを配置する

  1. Unityエディターを開きます。
    プロジェクトを作成して、シーンビューを確認してください。
  2. Cubeを作成する
    • ヒエラルキー(Hierarchy)ウィンドウで右クリックします。
    • メニューから「3D Object」→「Cube」を選択します。
    • Cubeがシーンビューに作成されます。
  3. Cubeをもう1つ作成する
    同じ手順で、2つ目のCubeを作成します。これで、シーン内に2つのCubeが配置されます。

2-2. カラー用のマテリアルを作成・適用する

次に、それぞれのCubeに異なる色を設定するために、マテリアルを作成します。

  1. 新しいマテリアルを作成する
    • プロジェクトウィンドウで右クリックし、「Create」→「Material」を選択します。
    • 新しいマテリアルが作成されます。名前を「RedMaterial」に変更しましょう。
  2. マテリアルに色を設定する
    • 作成した「RedMaterial」を選択します。
    • インスペクター(Inspector)ウィンドウで、Albedo のカラーをクリックします。
    • カラーピッカーで赤色を選択します。
  3. マテリアルをCubeに適用する
    • ヒエラルキーウィンドウで片方のCubeを選択します。
    • 作成した「RedMaterial」をドラッグ&ドロップでCubeにアタッチします。
  4. もう1つのCubeにもマテリアルを作成して適用する
    • 同じ手順で、もう1つのマテリアルを作成します。名前を「WhiteMaterial」に変更し、白色を設定します。
    • 作成した「WhiteMaterial」をもう1つのCubeにアタッチします。

これで、1つは赤色、もう1つは白色のCubeがシーン内に配置されました。この準備が完了したら、次のステップではクリックでカラーを取得し、適用するスクリプトを作成していきます!



3. スクリプト作成:カラーを取得して適用する方法

このセクションでは、クリック操作でオブジェクトのカラーを取得し、別のオブジェクトに適用するスクリプトを作成します。わかりやすく手順を説明するので、初心者でも安心して進められます!

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

  1. プロジェクトウィンドウを右クリックします。
  2. メニューから「Create」→「C# Script」を選択します。
  3. 新しいスクリプトに「ChangeColorOnClick」と名前を付けましょう。

スクリプトができたら、ダブルクリックしてコードエディタ(Visual Studioなど)で開きます。


コードを記述する

以下のコードをスクリプトに記述します。

using UnityEngine;

public class ChangeColorOnClick : MonoBehaviour
{
    private Material selectedMaterial;

    void Update()
    {
        // マウスの左クリックを検知
        if (Input.GetMouseButtonDown(0))
        {
            // クリックした位置からレイを飛ばす
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            RaycastHit hit;

            // レイがオブジェクトに当たった場合の処理
            if (Physics.Raycast(ray, out hit))
            {
                Renderer objRenderer = hit.collider.GetComponent<Renderer>();

                if (objRenderer != null)
                {
                    // まだカラーが選択されていない場合
                    if (selectedMaterial == null)
                    {
                        selectedMaterial = objRenderer.material;
                        Debug.Log("マテリアルを取得しました");
                    }
                    // カラーが選択済みの場合、適用する
                    else
                    {
                        objRenderer.material = selectedMaterial;
                        Debug.Log("マテリアルを適用しました");
                        selectedMaterial = null;
                    }
                }
            }
        }
    }
}

コードの説明

  • Raycastの使用
    クリック位置から「Ray」という目に見えない線を飛ばし、オブジェクトに当たったかを検知します。Physics.Raycastを使って、クリックされたオブジェクトの情報を取得しています。
  • Materialの取得と適用
    • selectedMaterialが空の場合は、クリックしたオブジェクトのMaterialを保存します。
    • すでにselectedMaterialがセットされている場合、保存されたカラーをクリックした別のオブジェクトに適用します。
  • Debug.Logの活用
    操作状況をコンソールで確認できるよう、取得や適用時にメッセージを出力しています。



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

ここでは、作成したスクリプト「ChangeColorOnClick」をCubeにアタッチする方法を説明します。以下の手順に従って進めてみましょう。


1. スクリプトをCubeにドラッグ&ドロップする

  1. ヒエラルキーウィンドウで、Cubeを選択します。
  2. プロジェクトウィンドウで、作成したスクリプト「ChangeColorOnClick」を探します。
  3. 「ChangeColorOnClick」スクリプトをクリックしたまま、Cubeにドラッグ&ドロップします。
    ドロップすると、インスペクターウィンドウにスクリプトがアタッチされているのが確認できます。

2. もう1つのCubeにも同様にアタッチ

  1. 2つ目のCubeをヒエラルキーウィンドウで選択します。
  2. 同じくプロジェクトウィンドウから「ChangeColorOnClick」スクリプトをドラッグ&ドロップしてアタッチします。

3. 確認ポイント

  • 両方のCubeに「ChangeColorOnClick」スクリプトがアタッチされていることを確認します。
  • インスペクターウィンドウの「Script」セクションにスクリプト名が表示されていれば成功です。

これでスクリプトのアタッチ作業は完了です。次に、シーンを再生して動作をテストしましょう!どのように動作するか、楽しみにしてくださいね。



5. 動作テストと結果の確認

ここまでで、2つのCubeに「ChangeColorOnClick」スクリプトが正しくアタッチされている状態になりました。それでは実際に動作をテストしてみましょう!

1. プレイモードを開始

Unityエディターの上部にある「▶」(再生ボタン)をクリックして、プレイモードを開始します。

2. Cubeをクリックしてカラーを取得

シーンビューまたはゲームビューで、最初にカラーを取得したいCube(例:赤色のCube)をクリックします。コンソールウィンドウには「マテリアルを取得しました」と表示され、スクリプトが正常に動作していることが確認できます。

3. 別のCubeをクリックしてカラーを適用

次に、もう一方のCube(例:白色のCube)をクリックします。クリック後、白色のCubeが赤色に変わり、コンソールウィンドウには「マテリアルを適用しました」と表示されるはずです。

4. 再度クリックしてリセット

2つのCubeを繰り返しクリックして、カラーの取得と適用を繰り返せることを確認してください。スクリプトはクリックするたびに、現在の操作に応じて動作を切り替えます。


ポイント

  • カメラの位置確認: Cubeが画面外に出てしまうとクリックできません。必要に応じてカメラの位置を調整してください。
  • コンソールをチェック: 動作に問題がある場合は、コンソールウィンドウにエラーメッセージが表示されている可能性があります。コードを確認して修正しましょう。

これで、動作テストと結果の確認は完了です!スクリプトが正しく動作することで、Unityの基礎的なスクリプトの使い方がしっかり理解できたはずです。



よくある質問

Q
なぜクリックしてもカラーが変更されないのですか?
A

クリックでカラーが変更されない場合、以下の点を確認してください。

  • カメラが正しく設定されているか:Cameraが正しい角度や位置に配置され、クリックしたいオブジェクトが視界に入っているか確認してください。
  • Colliderが設定されているか:RaycastはColliderがアタッチされているオブジェクトにしか反応しません。CubeにBox Colliderが設定されているか確認してください。
  • スクリプトが正しくアタッチされているか:Cubeにスクリプトがアタッチされているか、またスクリプト内でエラーが発生していないか確認しましょう。
Q
適用されるカラーが異なるのはなぜですか?
A

適用されるカラーが意図と異なる場合、次のポイントを確認してください。

  • Materialインスタンスの共有:取得したマテリアルが他のオブジェクトと共有されている可能性があります。この場合、取得後に Instantiate を使って新しいMaterialインスタンスを作成し、それを適用してください。
  • 正しいMaterialを取得しているか:RaycastでクリックしたオブジェクトのRendererからMaterialを正しく取得できているか確認してください。
Q
他の形状やオブジェクトでも同じコードが使えますか?
A

はい、このコードは基本的にどのオブジェクトにも使用できます。ただし、以下の条件を満たしている必要があります。

  • クリック対象のオブジェクトに Renderer コンポーネントが含まれていること。
  • Colliderが設定されており、Raycastがヒットするようになっていること。
    もし特殊な形状や条件で問題が発生する場合は、スクリプトを少し変更する必要があるかもしれません。

おすすめのアセット

「111 Realistic Materials with Pixelized Tilemaps」は、リアルな質感を持つ111種類のマテリアルと、ピクセル化されたタイルマップを含む2Dゲーム開発向けのアセットです。特にURP(Universal Render Pipeline)に対応しており、高解像度かつ最適化されたグラフィック表現が可能です。石や木材、金属などの多様な素材をリアルに再現し、ピクセルアートスタイルのゲームに特化した環境を構築できます。