UnityUnityメモ

Unityでキー操作によって複数のオブジェクトを切り替える

Unity

1.はじめに

この記事では、十字キー(左右の矢印キー)を使って3Dオブジェクトを切り替える方法を解説します。具体的には、「Cube」「Sphere」「Cylinder」の3つのオブジェクトを順番に表示・非表示に切り替えるシステムを作ります。

この機能は、簡単なスクリプトで実現可能で、Unity初心者でもスムーズに取り組めます。手順を一つひとつ丁寧に解説しますので、ぜひ一緒に試してみてください!

このチュートリアルを終える頃には、キー操作でオブジェクトを切り替える方法を理解し、他のプロジェクトにも応用できるスキルが身についているはずです。それでは、さっそく始めましょう!

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



2. セットアップ手順

この記事では、十字キーで「Cube」「Sphere」「Cylinder」の3つの3Dオブジェクトを切り替えるシステムを作成します。まずは、Unityエディタ内で必要なオブジェクトを準備していきましょう。以下の手順に従って進めてください。


1. Unityプロジェクトを開く

新しいUnityプロジェクトを開きましょう。テンプレートは 3D を選択してください。


2. 3Dオブジェクトを作成する

Hierarchy ウィンドウ を使って、切り替える対象のオブジェクトを作成します。

  1. Cubeを作成
    • Hierarchy ウィンドウ を右クリックします。
    • メニューから 3D ObjectCube を選択します。
    • 作成されたCubeを選択し、名前を「Cube」に変更してください。
  2. Sphereを作成
    • 再び Hierarchy ウィンドウ を右クリックします。
    • 3D ObjectSphere を選択します。
    • 名前を「Sphere」に変更してください。
  3. Cylinderを作成
    • 同じ手順で、 3D ObjectCylinder を選択します。
    • 名前を「Cylinder」に変更します。

3. オブジェクトの配置を調整する

作成した3つのオブジェクトが重ならないように、適度に配置を調整しましょう。

  1. 各オブジェクトを選択して Inspector ウィンドウ を確認します。
  2. Transform コンポーネントPosition を以下のように設定してください:
    • Cube: X = -2, Y = 0, Z = 0
    • Sphere: X = 0, Y = 0, Z = 0
    • Cylinder: X = 2, Y = 0, Z = 0

これで、3つのオブジェクトが横一列に並びます。


4. 見やすいようにカメラの位置を調整する(任意)

デフォルトのカメラ位置を調整して、3つのオブジェクトを一度に見えるようにします。

  1. Hierarchy ウィンドウ で「Main Camera」を選択します。
  2. Inspector ウィンドウTransform の設定を以下のように変更します:
    • Position: X = 0, Y = 2, Z = -8
    • Rotation: X = 10, Y = 0, Z = 0

5. シーンを保存する

ここまでの作業を保存します。

  1. File メニュー から Save As を選択します。
  2. シーン名を「ObjectSwitchScene」として保存してください。

これで、セットアップは完了です!次は、オブジェクトを切り替えるためのスクリプトを作成していきます。



3. スクリプト作成

Unityでオブジェクトを切り替えるスクリプトを作成していきましょう!今回は、十字キー(右キーと左キー)を使って3Dオブジェクトを順番に切り替えるロジックを作ります。

スクリプトの準備

  1. 新しいスクリプトを作成する
    • Unityの Project ウィンドウ で空白の場所を右クリックします。
    • メニューから「Create」→「C# Script」を選びます。
    • スクリプトの名前を「ItemSwitcher」に変更します。
  2. スクリプトを開く
    • 作成したスクリプトをダブルクリックして開きます。
    • Unityエディタに設定されているコードエディタ(通常はVisual Studio)が起動します。

スクリプトの入力

以下のコードをスクリプトに入力してください。

using UnityEngine;

public class ItemSwitcher : MonoBehaviour
{
    public GameObject[] items;  // 切り替え対象のオブジェクトを格納する配列
    private int currentIndex = 0;  // 現在表示中のオブジェクトのインデックス

    void Start()
    {
        // 最初にすべてのオブジェクトを非表示にしてから、最初のオブジェクトを表示する
        for (int i = 0; i < items.Length; i++)
        {
            items[i].SetActive(false);
        }
        items[currentIndex].SetActive(true);
    }

    void Update()
    {
        // 右キーが押されたとき
        if (Input.GetKeyDown(KeyCode.RightArrow))
        {
            items[currentIndex].SetActive(false);  // 現在のオブジェクトを非表示にする
            currentIndex = (currentIndex + 1) % items.Length;  // 次のオブジェクトのインデックスを計算
            items[currentIndex].SetActive(true);  // 次のオブジェクトを表示する
        }

        // 左キーが押されたとき
        if (Input.GetKeyDown(KeyCode.LeftArrow))
        {
            items[currentIndex].SetActive(false);
            currentIndex = (currentIndex - 1 + items.Length) % items.Length;  // 前のオブジェクトのインデックスを計算
            items[currentIndex].SetActive(true);
        }
    }
}

コードの解説

  1. public GameObject[] items
    • 切り替えたいオブジェクトを配列で管理します。
    • UnityエディタのInspectorウィンドウで、切り替え対象のオブジェクトを簡単に設定できるようにします。
  2. void Start()
    • シーンが開始されたときに呼び出されます。
    • 配列内のすべてのオブジェクトを最初に非表示(SetActive(false))にし、初期状態で最初のオブジェクトだけを表示(SetActive(true))します。
  3. void Update()
    • フレームごとに実行されます。
    • キー入力を検出して、右キーなら次のオブジェクト、左キーなら前のオブジェクトに切り替えます。
  4. インデックス管理
    • (currentIndex + 1) % items.Length で配列の次の要素に移動します。
    • (currentIndex - 1 + items.Length) % items.Length で配列の前の要素に移動します。
    • % items.Length を使うことでインデックスが循環し、配列の最初と最後がつながります。

これでスクリプトの準備が完了しました!次のステップでは、このスクリプトをUnityシーンに組み込む方法を説明します。



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

次に、作成したスクリプトをUnityシーンに適用していきます。以下の手順で進めてみましょう!

1. 空のゲームオブジェクトを作成

まずは、スクリプトをアタッチするための空のゲームオブジェクトを作成します。

  1. Hierarchy ウィンドウを右クリックします。
  2. 表示されるメニューから「Create Empty」を選択します。
  3. 作成された空のゲームオブジェクトに名前を付けましょう。ここでは「ItemSwitcherController」とします。
    • 名前を変更するには、オブジェクトを選択した状態で F2キー を押すか、Inspector ウィンドウで「Name」の欄に直接入力します。

2. スクリプトをアタッチ

次に、「ItemSwitcherController」に作成したスクリプトを適用します。

  1. Project ウィンドウで「ItemSwitcher.cs」を見つけます。
  2. 「ItemSwitcherController」にドラッグ&ドロップします。
    • これでスクリプトがオブジェクトにアタッチされます。
  3. Inspector ウィンドウを確認し、「ItemSwitcher」のコンポーネントが追加されていることを確認します。

3. Items 配列にオブジェクトを追加

スクリプト内の Items 配列に切り替え対象のオブジェクトを登録しましょう。

  1. 「ItemSwitcherController」を選択し、Inspector ウィンドウで「Items (Size)」のフィールドを見つけます。
  2. 「Size」の数値を「3」に設定します(今回は Cube、Sphere、Cylinder の3つを切り替え対象にします)。
  3. 項目が3つ表示されるので、それぞれに以下のオブジェクトをドラッグ&ドロップします。
    • Element 0: Cube
    • Element 1: Sphere
    • Element 2: Cylinder

4. 設定内容を確認

ここまでの手順が正しく完了しているか確認しましょう。

  1. Hierarchy ウィンドウで「ItemSwitcherController」を選択します。
  2. Inspector ウィンドウの「Items」フィールドに、正しいオブジェクトが登録されているかチェックしてください。

これでスクリプトのアタッチは完了です!次は、シーンを再生して、キー操作でオブジェクトが切り替わる動作を確認してみましょう。問題があれば「よくある質問」のセクションやエラーの内容を参考に解決してください。



5. テストプレイ

ここまでの手順が完了したら、いよいよシーンを再生して動作確認を行いましょう!以下の手順で、十字キー操作によるオブジェクト切り替えをテストします。

シーンを再生する

  1. Unityエディタの上部にある 再生ボタン(▶️) をクリックします。
  2. シーンが再生モードに切り替わります。

動作確認

  1. キーボードの 右矢印キー(→) を押します。
    • Cubeが非表示になり、Sphereが表示されることを確認してください。
  2. 再度 右矢印キー(→) を押します。
    • Sphereが非表示になり、Cylinderが表示されるはずです。
  3. さらに 右矢印キー(→) を押します。
    • Cylinderが非表示になり、Cubeが再び表示されます。
  4. キーボードの 左矢印キー(←) を押します。
    • Cubeが非表示になり、Cylinderが表示されます。
  5. 再度 左矢印キー(←) を押します。
    • Cylinderが非表示になり、Sphereが表示されるはずです。
  6. 最後に 左矢印キー(←) を押します。
    • Sphereが非表示になり、Cubeが再び表示されます。

動作しない場合の確認ポイント

  • スクリプトがアタッチされているか確認
    Hierarchyウィンドウで空のゲームオブジェクトを選択し、Inspectorウィンドウにスクリプトが表示されているか確認してください。
  • Items配列にオブジェクトが設定されているか確認
    Inspectorウィンドウで Items 配列に Cube、Sphere、Cylinder の3つが正しく追加されているか確認してください。
  • オブジェクトがアクティブになっているか確認
    各オブジェクトが正常に非表示・表示されない場合は、SetActive メソッドを呼び出す箇所にミスがないかスクリプトをチェックしてください。

動作が確認できたら、さらに応用してカメラやライトを連動させたり、切り替え時にアニメーションを追加するなど、オリジナルのアイデアを試してみましょう!

これで基本的な切り替え機能のテストは完了です!楽しみながら開発を進めてくださいね。 😊



6. 応用アイデア

十字キーでオブジェクトを切り替える仕組みができたら、さらに楽しい機能を追加してみましょう!ここでは、初心者でも取り組みやすい応用アイデアをいくつか紹介します。

6.1 カメラの視点切り替え

オブジェクトを切り替えるだけでなく、カメラの視点も変わるようにすると、よりダイナミックな演出が可能です。たとえば、各オブジェクトの位置や角度に応じてカメラを移動させるスクリプトを追加してみましょう。

実装例:

  1. 各オブジェクトの位置に対応するカメラの位置を定義します。
  2. スクリプトの Update 関数で現在のオブジェクトに応じてカメラを移動させます。

以下のコードを ItemSwitcher スクリプトに追加してみてください。

public Transform cameraTransform; // カメラのTransform
public Vector3[] cameraPositions; // カメラの位置リスト

void Update()
{
// オブジェクトの切り替え部分
// 既存のコード...

// カメラの位置を更新
cameraTransform.position = cameraPositions[currentIndex];
}

Inspector ウィンドウで cameraTransform にカメラを、cameraPositions にオブジェクトごとに異なるカメラ位置を設定します。


6.2 ライトの切り替え

オブジェクトに応じてシーンのライトを変更すると、より雰囲気が出ます。たとえば、Cubeのときは明るいライト、Sphereのときは暗いライト、Cylinderのときはカラーライトを適用するなど、演出の幅が広がります。

実装例:

  1. Hierarchy ウィンドウに複数のライトを追加。
  2. スクリプトでライトのオン/オフを制御。
public Light[] lights; // ライトのリスト

void Start()
{
// すべてのライトを非アクティブに
foreach (Light light in lights)
{
light.gameObject.SetActive(false);
}
lights[currentIndex].gameObject.SetActive(true);
}

void Update()
{
// オブジェクトの切り替え部分
// 既存のコード...

// ライトの切り替え
foreach (Light light in lights)
{
light.gameObject.SetActive(false);
}
lights[currentIndex].gameObject.SetActive(true);
}

Inspector ウィンドウで lights 配列にライトを追加すれば完成です!


6.3 オブジェクトのアニメーション追加

オブジェクトが切り替わるときにアニメーションを再生すれば、より視覚的に楽しめる演出を実現できます。たとえば、切り替え時にオブジェクトがフェードイン・アウトしたり、回転するアニメーションを適用できます。

手順:

  1. 各オブジェクトに Animator コンポーネントを追加。
  2. Animator Controller でフェードや回転のアニメーションを作成。
  3. スクリプトで切り替え時にアニメーションを再生。

例: 以下のコードを既存のスクリプトに追加します。

public Animator[] animators; // オブジェクトごとのAnimator

void Update()
{
// オブジェクトの切り替え部分
// 既存のコード...

// アニメーションの再生
animators[currentIndex].SetTrigger("Play");
}

Animator ControllerPlay トリガーを使用してアニメーションを設定すれば動作します。


これらの応用アイデアを取り入れることで、切り替え機能がさらに魅力的になります。ぜひ、自分だけの演出を工夫してみてください!



よくある質問(FAQ)

Q
キー操作が反応しないときの対処法は?
A

キー操作が反応しない場合、以下のポイントを確認してください:

  • スクリプトが正しくアタッチされているか確認します。ItemSwitcher スクリプトが空のゲームオブジェクトにアタッチされていることを確認してください。
  • Inspectorで Items 配列にオブジェクトが追加されているか確認します。オブジェクトが配列に登録されていないと切り替えが機能しません。
  • Input.GetKeyDown のキーコード(例: KeyCode.RightArrow)が正しいか確認します。キーボード設定やカスタムキー設定が影響している場合もあるので注意してください。
Q
切り替え順を変えることはできますか?
A

はい、切り替え順は簡単に変更できます。Items 配列の順番を変えることで切り替えの順序が変わります。

  1. Inspector ウィンドウで Items 配列を展開します。
  2. 順番を変更したいオブジェクトをドラッグ&ドロップで配置し直してください。 例えば、Cube → Sphere → CylinderSphere → Cube → Cylinder に変更することで、切り替え順が変わります。
Q
他のキーに機能を割り当てるにはどうすればいいですか?
A

使用するキーはスクリプト内で指定しています。以下のように Update() メソッドのコードを編集すれば、別のキーを割り当てることができます:

// 右キーを「D」キーに変更する場合
if (Input.GetKeyDown(KeyCode.D))
{
items[currentIndex].SetActive(false);
currentIndex = (currentIndex + 1) % items.Length;
items[currentIndex].SetActive(true);
}

// 左キーを「A」キーに変更する場合
if (Input.GetKeyDown(KeyCode.A))
{
items[currentIndex].SetActive(false);
currentIndex = (currentIndex - 1 + items.Length) % items.Length;
items[currentIndex].SetActive(true);
}

Inspectorで KeyCode を変数として設定できるようにスクリプトを拡張すると、より柔軟に変更可能です。

おすすめのアセット

「Snake Warz.IO – Slither Worm Complete Game Template」は、Unityで「スネーク」タイプのマルチプレイヤーゲームを構築するためのテンプレートです。リアルタイムのオンラインプレイ、シンプルなカスタマイズ、滑らかなコントロールなどが特徴で、初心者でもすぐにプロジェクトを開始できます。必要なゲームロジックがすべて組み込まれているので、ゲームの外観やルールを簡単にアレンジ可能。