UnityUnityメモ

Unity初心者必見!簡単なスクリプトで色が変わる機能を作る

Unity

はじめに

Unityを使ってゲームを作るとき、プレーヤーオブジェクトが他のオブジェクトに触れるとその色に変わる、という簡単なインタラクティブ機能を作る方法を知っておくと便利です。この機能は、初心者でも理解しやすく、ゲーム開発の基本的なスキルを学ぶのに最適な練習課題です。


今回のチュートリアルでは、以下のことを学びます:

  • Unityでオブジェクトを配置する基本操作
  • スクリプトを使ってプレーヤーオブジェクトを動かす方法
  • オブジェクトに触れたときに色を変更する簡単なスクリプトの作り方

この記事では、プレーヤーとなる「Cube(キューブ)」を操作して、他の色違いのCubeに触れるとその色に変わる仕組みを作ります。Unity初心者の方でも安心して取り組めるように、丁寧に解説していきます!ゲーム開発の第一歩を一緒に始めましょう!

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



1.環境の準備

Unityで開発を始めるには、まず基本的なプロジェクトの設定と必要なオブジェクトの配置を行います。以下の手順に従って準備を進めましょう。


Unityプロジェクトを作成する

  1. Unity Hubを開き、「新しいプロジェクト」をクリックします。
  2. テンプレートとして「3D」を選択し、プロジェクト名を入力(例: ColorChangeProject)。
  3. 作成したプロジェクトを開きます。

基本オブジェクトを配置する

Unityのシーンには、プレーヤーが操作する「キューブ(Cube)」と、床の役割を果たす「プレーン(Plane)」を追加します。

  1. 床の作成
    • ヒエラルキー(Hierarchy)ウィンドウで右クリック。
    • 「3D Object」→「Plane」を選択。
    • Planeがシーンに追加されるので、適当な位置に配置(例: Position(0, 0, 0))。
    • Planeのスケールを大きくして、広い床を作成します。(例: Scale(5, 1, 5)
  2. プレーヤーオブジェクトの作成
    • 再びヒエラルキーで右クリック。
    • 「3D Object」→「Cube」を選択。
    • Cubeがシーンに追加されるので、プレーヤーとして使います。
    • Cubeの位置を少し上に設定して(例: Position(0, 0.5, 0))、床の上に配置します。

オブジェクトに名前をつける

作成したオブジェクトをわかりやすくするために名前をつけます。

  1. ヒエラルキーで「Plane」を右クリック→「Rename」でFloorと変更。
  2. 同様に「Cube」を右クリック→「Rename」でPlayerと変更。

これで、基本的な環境の準備が完了しました!次はオブジェクトに色をつけたり、プレーヤーを動かすためのスクリプトを作成していきましょう。



2.マテリアルの作成と設定

Unityでは、オブジェクトの見た目を変えるために「マテリアル」を使います。このセクションでは、プレーヤーオブジェクトと触れるオブジェクトに適用するマテリアルを作成し、それぞれの色を設定する手順を解説します。


マテリアルを作成する手順

  1. プロジェクトウィンドウを開く
    • Unity画面下部にある「Project」ウィンドウを確認します。
  2. 新しいマテリアルを作成
    • プロジェクトウィンドウ内で右クリックします。
    • 「Create」→「Material」を選択します。
    • 作成されたマテリアルの名前を「PlayerMaterial」と変更します。
  3. マテリアルの色を設定
    • 作成した「PlayerMaterial」を選択します。
    • Inspectorウィンドウ(右側)で、Albedoのカラーパレットをクリック。
    • 好きな色を選びます(例えば赤)。
  4. マテリアルをプレーヤーオブジェクトにアタッチ
    • ヒエラルキーウィンドウでプレーヤーのCubeを選択します。
    • 作成した「PlayerMaterial」をCubeにドラッグ&ドロップします。

触れるオブジェクトのマテリアルを作成

  1. 異なるマテリアルを作成
    • 上記と同じ手順で、複数のマテリアルを作成します。
    • 名前をそれぞれ「BlueMaterial」「GreenMaterial」などに設定し、異なる色を設定します。
  2. 触れるオブジェクトに適用
    • ヒエラルキーウィンドウで触れるキューブオブジェクトを選択します。
    • 作成したマテリアルを、それぞれのCubeにドラッグ&ドロップして適用します。

チェックポイント

  • プレーヤー用のキューブに「PlayerMaterial」が適用されているか確認します。
  • 触れるキューブに異なる色のマテリアルが設定されているか確認します。

これで、プレーヤーと触れるオブジェクトに個別のマテリアルを適用する準備が完了しました!次は、プレーヤーが触れたときに色が変わるスクリプトを設定していきましょう!



3.プレーヤーの動きをスクリプトで制御

Unityでプレーヤーオブジェクトを動かすには、C#スクリプトを作成してキーボードの入力を受け取り、その動きに応じてプレーヤーを移動させる処理を記述します。以下の手順で進めましょう。


スクリプトを作成する

  1. プロジェクトウィンドウでスクリプトを作成
    • Unityエディターの下部にあるプロジェクトウィンドウで右クリックし、「Create」→「C# Script」を選択します。
    • スクリプトの名前を「ColorChange」と設定してください。
  2. スクリプトを編集する
    • 作成したスクリプトをダブルクリックして、Visual Studioや選択したコードエディタで開きます。
    • 以下のコードをコピーして貼り付けます。

各部分の説明

  • 宣言部分
public GameObject obj;
public Color objColor;
  1. public GameObject obj;:衝突したオブジェクトを保存する変数です。
  2. public Color objColor;:そのオブジェクトの色を保存する変数です。
  • Updateメソッド
void Update()
{
    float dx = Input.GetAxis("Horizontal") * Time.deltaTime * 3;
    float dz = Input.GetAxis("Vertical") * Time.deltaTime * 3;
    transform.position = new Vector3(
    transform.position.x + dx, 0, transform.position.z + dz
    );
}
  1. Update():毎フレーム実行されるメソッドです。
  2. Input.GetAxis("Horizontal"):左右の矢印キーまたはA/Dキーの入力を取得します。
  3. Input.GetAxis("Vertical"):上下の矢印キーまたはW/Sキーの入力を取得します。
  4. Time.deltaTime:前のフレームからの時間差を取得します。これを使うことで、スムーズな動きを実現します。
  5. transform.position:オブジェクトの現在位置を取得します。
  6. new Vector3():新しい位置を計算して設定します。
  • OnCollisionEnterメソッド
void OnCollisionEnter(Collision collision)
{
    obj = collision.gameObject;
    objColor = obj.GetComponent<Renderer>().material.color;
    GetComponent<Renderer>().material.color = objColor;
}
  1. OnCollisionEnter(Collision collision):このオブジェクトが他のオブジェクトと衝突したときに呼ばれるメソッドです。
  2. collision.gameObject:衝突したオブジェクトを取得します。
  3. obj.GetComponent<Renderer>().material.color:衝突したオブジェクトの色を取得します。
  4. GetComponent<Renderer>().material.color = objColor:現在のオブジェクトの色を衝突したオブジェクトの色に変更します。

全体の動き

  1. ゲームが始まると、Updateメソッドが毎フレーム実行されます。
  2. プレイヤーが矢印キーやWASDキーを押すと、その入力に応じてオブジェクトが左右または前後に移動します。
  3. 移動中に他のオブジェクトと衝突すると、OnCollisionEnterメソッドが呼び出されます。
  4. 衝突したオブジェクトの色が取得され、移動するオブジェクトの色がその色に変更されます。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ColorChange : MonoBehaviour
{
    public GameObject obj; // 接触したオブジェクトを格納
    public Color objColor; // オブジェクトの色を格納

    void Update()
    {
        // キーボード入力を受け取り、プレーヤーを移動
        float dx = Input.GetAxis("Horizontal") * Time.deltaTime * 3; // 左右
        float dz = Input.GetAxis("Vertical") * Time.deltaTime * 3;   // 前後
        transform.position = new Vector3(
            transform.position.x + dx, 0, transform.position.z + dz
        );
    }

    void OnCollisionEnter(Collision collision)
    {
        // 接触したオブジェクトの色を取得し、プレーヤーの色を変更
        obj = collision.gameObject;
        objColor = obj.GetComponent<Renderer>().material.color;
        GetComponent<Renderer>().material.color = objColor;
    }
}

スクリプトをアタッチする

  1. プレーヤーオブジェクト(Cube)にスクリプトをアタッチ
    • ヒエラルキーウィンドウで、プレーヤーとして設定したCubeを選択します。
    • 作成した「ColorChange」スクリプトをプロジェクトウィンドウからCubeにドラッグ&ドロップします。
  2. スクリプトの確認
    • Cubeを選択した状態で、インスペクターウィンドウを確認します。
    • 「ColorChange」スクリプトが正しくアタッチされていることを確認してください。



4.機能をテストする

1.プレイモードに切り替える

  1. Unityエディターの上部にある「▶︎」(再生ボタン)をクリックします。これでプレイモードに入ります。
  2. ゲーム画面がアクティブになり、操作が可能になります。

2.プレーヤーを操作する

  1. キーボードを使ってプレーヤーオブジェクトを動かします。
    • 矢印キーまたは「W」「A」「S」「D」キーで操作
      • 横移動:左矢印キーまたは「A」キー
      • 縦移動:上矢印キーまたは「W」キー
      • 後退:下矢印キーまたは「S」キー
      • 右移動:右矢印キーまたは「D」キー
  2. スムーズに動くか確認してください。

3.他のオブジェクトに触れる

  1. プレーヤーオブジェクトを動かし、色付きのCubeオブジェクトに接触させます。
  2. 接触した瞬間に、プレーヤーオブジェクトの色が触れたオブジェクトと同じ色に変わることを確認します。

4.正しく動作しているかチェックする

以下の点を確認してください:

  1. プレーヤーオブジェクトの色が触れたCubeの色に変更されている。
  2. 接触したCubeの色は変更されず、そのまま保持されている。
  3. プレーヤーの移動がスムーズに行える。

5.プレイモードを終了する

  1. Unityエディター上部の再生ボタンをもう一度クリックして、プレイモードを終了します。
  2. シーンが元の状態に戻り、編集が可能になります。

注意点

  • 色が変わらない場合は、スクリプトや設定を見直しましょう。
  • Colliderコンポーネントがすべてのオブジェクトに正しく設定されているか確認してください。
  • Cubeにアタッチしたマテリアルが正しい色に設定されているかを再チェックしてください。

これで、機能が正しく動作しているかテスト完了です!問題なく動いたら、次のステップに進みましょう! 🎉



5.より良い機能の実現に向けて

Unityでは、基本機能を実装した後にさらに改良を加えることで、ゲームをより面白く、操作性の良いものにすることができます。このセクションでは、今回の「色が変わる」機能にいくつかの改良を加える方法を紹介します。


H3: タグを使って特定のオブジェクトだけ反応させる

現状ではプレーヤーが触れたすべてのオブジェクトに反応して色が変わる仕様になっていますが、特定のオブジェクトにのみ反応するようにできます。

  1. タグを設定する
    • 色を変えたいオブジェクトに対して、「Inspector」ウィンドウで「Tag」を設定します。
      • 例: 「ColorChangeable」という新しいタグを作成し、対象オブジェクトに適用します。
    • タグを設定していないオブジェクトは無視されるようになります。
  2. スクリプトを修正する
    • 以下のコードをOnCollisionEnterメソッドに追加します:
void OnCollisionEnter(Collision collision)
{
    if (collision.gameObject.CompareTag("ColorChangeable"))
    {
        obj = collision.gameObject;
        objColor = obj.GetComponent<Renderer>().material.color;
        GetComponent<Renderer>().material.color = objColor;
    }
}
  • この修正により、「ColorChangeable」タグが付いたオブジェクトにのみ色が反応するようになります。

H3: スムーズな動きのためにRigidBodyを追加

現在の動きはTransformを直接操作しているため、衝突の際に物理的なリアリティがありません。Unityの物理エンジンを活用することで、よりスムーズで現実的な動きに改良できます。

  1. RigidBodyを追加
    • プレーヤーオブジェクトのCubeに「Inspector」ウィンドウで「Add Component」→「RigidBody」を追加します。
    • 物理挙動が有効になり、重力や衝突がリアルに表現されます。
  2. スクリプトを修正
    • 動きのコードをUpdateからFixedUpdateに移し、RigidBodyを使った力の加え方に変更します:
private Rigidbody rb;

void Start()
{
    rb = GetComponent<Rigidbody>();
}

void FixedUpdate()
{
    float dx = Input.GetAxis("Horizontal") * 3;
    float dz = Input.GetAxis("Vertical") * 3;
    Vector3 movement = new Vector3(dx, 0, dz);
    rb.MovePosition(transform.position + movement * Time.fixedDeltaTime);
}
  • この変更により、プレーヤーの動きが物理的に自然になります。

H3: カラーパレットを活用してランダムな色に変化

触れたオブジェクトの色ではなく、ランダムな色に変わる機能を追加すると、さらに面白い体験を提供できます。

  1. ランダム色を生成
    • スクリプト内でRandom.ColorHSV()を使います:
void OnCollisionEnter(Collision collision)
{
    if (collision.gameObject.CompareTag("ColorChangeable"))
    {
        Color randomColor = Random.ColorHSV();
        GetComponent<Renderer>().material.color = randomColor;
    }
}
  • オブジェクトに触れるたびにランダムな色が生成され、プレーヤーのCubeに適用されます。

H3: サウンドやエフェクトを追加

最後に、色が変わる際に視覚や聴覚にフィードバックを追加することで、ゲームの体験がさらに向上します。

  1. サウンドを追加
    • 色が変わるタイミングで音を再生するスクリプトを追加します
public AudioClip colorChangeSound;
private AudioSource audioSource;

void Start()
{
    audioSource = GetComponent<AudioSource>();
}

void OnCollisionEnter(Collision collision)
{
    if (collision.gameObject.CompareTag("ColorChangeable"))
    {
        audioSource.PlayOneShot(colorChangeSound);
        Color randomColor = Random.ColorHSV();
        GetComponent<Renderer>().material.color = randomColor;
    }
}
  • AudioSourceコンポーネントをCubeに追加し、サウンドクリップを設定します。
  • エフェクトを追加
    • 色が変わる際にパーティクルエフェクトを再生することで、見た目にインパクトを持たせることが可能です。

これらの改良を加えることで、初心者向けのチュートリアルを一歩進めた、より魅力的なゲーム開発に挑戦できます!



よくある質問

Q
スクリプトをアタッチする際にエラーが出ます。どうすればいいですか?
A

スクリプト名がUnityのC#規則に反している場合があります。ファイル名とクラス名が一致しているか確認してください。

Q
プレーヤーがオブジェクトに触れても色が変わりません。原因は?
A

オブジェクトにColliderが付いているか、プレーヤーとオブジェクトのタグが正しく設定されているか確認してください。

Q
プレーヤーの動きが遅い場合、速度を変更できますか?
A

Updateメソッド内のTime.deltaTime * 3の数値を調整することで速度を変更できます。

おすすめのアセット

「Color Jump – Complete Game」は、色を変えながらジャンプして進むシンプルで楽しいゲームテンプレートです。このアセットは、プレイヤーがジャンプして色を一致させることで進行し、高得点を目指します。初心者でも使いやすく、カスタマイズが簡単です。