UnityUnityメモ

Unityでプレイヤーの動きと反対方向にオブジェクトを動かす方法!

Unity

1. はじめに

Unityを使ったゲーム開発の楽しさは、さまざまなアイデアを簡単に実現できるところにあります。今回の記事では、プレイヤーの動きに合わせて、別のオブジェクトが反対方向に動く仕組みを作る方法を解説します。この方法を学べば、ゲームにおけるユニークな仕掛けやギミックを作る際に役立ちますよ!

たとえば、プレイヤーが進む方向とは逆に障害物が動く仕組みを作ったり、マップ全体が動いているような演出を加えることもできます。Unity初心者の方でも安心して取り組めるように、基本から丁寧に説明しますので、ぜひ挑戦してみてください。


このチュートリアルでは以下の内容を学びます:

  • Cube(プレイヤー)の動きを制御するスクリプトの作成
  • Cubeの動きを参照し、Sphere(別のオブジェクト)を反対方向に動かすスクリプトの作成
  • 実際に動作させて確認する方法

Unityのバージョンは特に指定はありませんが、Unity 2021.3 LTS以降を使用することを推奨します。このバージョンでは安定性が高く、初心者にも扱いやすい環境が整っています。

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



2. Cube(プレイヤー)の作成と基本スクリプト

この記事では、Unityでプレイヤー(Cubeオブジェクト)を作成し、キーボード入力で動かせるようにするスクリプトを実装します。具体的な手順を追っていきましょう!


Cubeオブジェクトを作成する

まずは、ゲーム内で動かすプレイヤーとしてCubeオブジェクトを作成します。以下の手順に従ってください。

  1. ヒエラルキー(Hierarchy)ウィンドウで右クリック
    ヒエラルキーウィンドウの任意の場所を右クリックします。
  2. 「3D Object」→「Cube」を選択
    メニューから「3D Object」を選び、その中の「Cube」をクリックします。
  3. Cubeの名前を変更(オプション)
    作成されたCubeを「Player」などわかりやすい名前に変更しておきましょう。名前を変更するには、Cubeを選択してF2キーを押すか、インスペクター(Inspector)ウィンドウで名前を直接編集します。

CubeControllerスクリプトの作成

次に、Cubeを動かすためのスクリプトを作成し、それをCubeにアタッチします。

  1. スクリプトを作成する
    1. プロジェクトウィンドウの空白部分を右クリックします。
    2. 「Create」→「C# Script」を選択します。
    3. 作成されたスクリプトに「CubeController」という名前を付けます。
  2. スクリプトをCubeにアタッチする
    1. 「CubeController」スクリプトをプロジェクトウィンドウからヒエラルキーウィンドウのCubeオブジェクトにドラッグ&ドロップします。
    2. スクリプトが正しくアタッチされると、インスペクターウィンドウの「Add Component」欄に「CubeController」が表示されます。

CubeControllerスクリプトにコードを記述する

次に、CubeControllerスクリプトを編集し、Cubeがキーボード入力で動くようにしましょう。

  1. スクリプトを開く
    CubeControllerスクリプトをダブルクリックすると、コードエディタ(Visual Studioなど)が開きます。
  2. 以下のコードを入力する
using UnityEngine;

public class CubeController : MonoBehaviour
{
    public float moveSpeed = 5f;  // Cubeの移動速度
    public Vector3 position;      // Cubeの座標を保存する変数

    void Update()
    {
        // キー入力でCubeを動かす
        float moveX = Input.GetAxis("Horizontal") * moveSpeed * Time.deltaTime;
        float moveZ = Input.GetAxis("Vertical") * moveSpeed * Time.deltaTime;

        // Cubeの位置を更新
        transform.Translate(moveX, 0f, moveZ);

        // XとZ座標を変数に保存
        position = transform.position;
    }
}

コードの解説

  • public float moveSpeed = 5f;
    Cubeが動く速さを設定しています。必要に応じて数値を変更するとスピードが変わります。
  • Input.GetAxis("Horizontal")Input.GetAxis("Vertical")
    Unityでデフォルト設定されているキーボードの矢印キーやWASDキーで移動入力を取得します。
  • transform.Translate(moveX, 0f, moveZ);
    Cubeの位置をリアルタイムで更新し、キーボード入力に応じて動かします。
  • position = transform.position;
    現在のCubeの位置を保存します。この変数は後ほどSphereの動きに使用します。

ここまでで、Cubeがキーボード入力によって動く準備が整いました。次は、Sphereオブジェクトを作成し、Cubeの動きに基づいて反対方向に移動させるスクリプトを実装していきましょう!



3. Sphereの作成と反対方向スクリプト

このセクションでは、Sphereオブジェクトを作成し、Cube(プレイヤー)の動きに連動してSphereを反対方向に動かすスクリプトを追加する方法を解説します。


3.1 Sphereオブジェクトの作成

  1. ヒエラルキー(Hierarchy)ウィンドウで右クリックします。
  2. **「3D Object」→「Sphere」**を選択します。これでシーンにSphereオブジェクトが追加されます。
  3. 作成されたSphereを選択し、インスペクター(Inspector)ウィンドウで名前を「Sphere」に変更すると管理しやすくなります。

3.2 SphereControllerスクリプトの作成

次に、Sphereを反対方向に動かすスクリプトを作成します。

  1. プロジェクトウィンドウで右クリックします。
  2. **「Create」→「C# Script」**を選択し、スクリプトに「SphereController」と名前を付けます。
  3. SphereControllerスクリプトをダブルクリックして開き、以下のコードを入力してください。
using UnityEngine;

public class SphereController : MonoBehaviour
{
    public GameObject cube; // Cubeオブジェクトを参照するための変数
    private CubeController cubeController; // CubeControllerスクリプトを参照するための変数

    void Start()
    {
        // CubeのCubeControllerスクリプトを取得
        cubeController = cube.GetComponent<CubeController>();
    }

    void Update()
    {
        if (cubeController != null)
        {
            // CubeのXとZ座標を取得し、Sphereを反対方向に移動
            Vector3 cubePosition = cubeController.position;
            Vector3 inversePosition = new Vector3(-cubePosition.x, transform.position.y, -cubePosition.z);
            transform.position = inversePosition;
        }
    }
}

3.3 スクリプトのアタッチと設定

  1. SphereControllerスクリプトをSphereオブジェクトにドラッグ&ドロップしてアタッチします。
  2. インスペクターウィンドウで以下の設定を行います:
    • 「Cube」フィールドに、ヒエラルキーにある「Cube」オブジェクトをドラッグ&ドロップします。

3.4 コードの動作説明

  • cube: ヒエラルキー上のCubeオブジェクトを参照します。
  • cubeController: CubeControllerスクリプトを取得し、Cubeの座標データを使用できるようにします。
  • Updateメソッド: 毎フレーム、Cubeの位置を取得し、X座標とZ座標を反転させた位置にSphereを移動します。

これでSphereがCubeの動きに連動して反対方向に動くようになります!次のセクションでは、動作確認の手順と、さらに発展させるアイデアを紹介します。



4. 動作確認と応用アイデア

動作確認

作成したスクリプトが正しく動作するか確認しましょう。以下の手順でテストを行います。

  1. シーンを保存する
    作業中のシーンがまだ保存されていない場合は、「File」→「Save As」からシーンを保存してください。ファイル名は「PlayerAndSphereTest」など、わかりやすい名前を付けておくと良いでしょう。
  2. Cube(プレイヤー)の動作確認
    • 再生ボタン(▶)をクリックしてゲームを開始します。
    • キーボードの矢印キーや「W」「A」「S」「D」キーを使ってCubeを動かします。
    • Cubeがスムーズに動くことを確認してください。
  3. Sphereの反対方向の動き確認
    • Cubeを動かすと、SphereがCubeの動きと反対方向に移動するはずです。
    • Cubeが右に動けばSphereが左に、Cubeが前に動けばSphereが後ろに移動するか確認してください。
  4. エラーが発生した場合の対処
    • スクリプトがアタッチされていない、または「cube」が正しく設定されていないと動作しません。
    • 「Console」タブでエラー内容を確認し、スクリプトやオブジェクト設定を見直してください。

応用アイデア

この基本的なスクリプトを応用して、さらに面白い動きを作り出すことができます。以下のアイデアを参考にしてみてください。

  1. 複数のオブジェクトを動かす
    • Sphereだけでなく、複数のオブジェクトをCubeの動きに応じて反対方向に動かすこともできます。
    • List<GameObject>を使って、複数のオブジェクトを一括管理する方法を試してみましょう。
  2. カメラの動きに応用する
    • Cubeの動きを基準に、カメラが自動で追従しながら反対側の視点に回り込む仕組みを作れます。ゲームプレイ中の新しい視点を提供できるかもしれません。
  3. 回転やスケールに応用する
    • 反対方向に動かすだけでなく、Cubeの動きに応じてオブジェクトの回転やスケールを反転させるスクリプトを追加してみましょう。
  4. UIやエフェクトとの連動
    • Cubeが動くたびにSphereにエフェクト(例えばパーティクルや色の変化)を付けることで、視覚的なインパクトを与えることができます。
    • UIにCubeとSphereの位置情報を表示させて、リアルタイムで確認できる仕組みを作るのも良いでしょう。

このステップでは、Cubeの動きに基づいてSphereが反対方向に動く仕組みを構築しました。基本的な動作を理解したら、ぜひ応用例に挑戦して独自の動きを作り出してみてください!



よくある質問

Q
スクリプトがうまく動かない場合の確認方法は?
A

スクリプトが動かない場合は、以下を確認してください:

  • オブジェクトのアタッチ: CubeControllerスクリプトがCubeに、SphereControllerスクリプトがSphereに正しくアタッチされているかを確認してください。
  • インスペクターの設定: SphereControllerのインスペクターで、cubeフィールドにCubeオブジェクトがドラッグ&ドロップされているか確認してください。
  • エラーメッセージ: コンソールにエラーが表示されている場合、エラー内容を確認して修正してください。
Q
他のオブジェクトでも同じ仕組みを使えますか?
A

はい、他のオブジェクトでも同じ仕組みを使用できます!
Sphere以外のオブジェクトを反対方向に動かしたい場合は、SphereControllerスクリプトをコピーして新しいオブジェクト用に調整してください。その際、スクリプト内で使用する参照や変数名を変更することをお勧めします。

Q
プレイヤーが回転した場合、この仕組みはどうなりますか?
A

現状のスクリプトでは、プレイヤーの回転は考慮されません。プレイヤーが回転した場合でも、Sphereは回転に関係なくXとZ座標の反対方向に移動します。
プレイヤーの回転に応じて反対方向を動かす場合は、以下のようなコードを追加する必要があります:

Vector3 forward = cube.transform.forward;
Vector3 right = cube.transform.right;
Vector3 inversePosition = cube.transform.position - (forward + right) * 2;
transform.position = new Vector3(inversePosition.x, transform.position.y, inversePosition.z);

これにより、プレイヤーの向きに基づいた反対方向の動きが可能になります。

おすすめのアセット

「MS – Monster Ultimate Pack」は、ゲーム開発者向けに幅広いクリーチャーキャラクターを提供する3Dアセットパックです。このパックには、さまざまなモンスターやクリーチャーのモデルが含まれており、アクション、ファンタジー、RPGなどのジャンルで使用するのに最適です。各モデルは高品質で、ゲーム内での没入感を高めるディテールが特徴です。