UnityUnityメモ

Unity初心者向け!プレイヤーがアイテムを取得する仕組みを作ろう

Unity

1. はじめに

この記事では、Unity初心者向けに、プレイヤーがアイテムを取得し、それを保持する仕組みを簡単なステップで作成する方法を解説します。例えば、3D空間で動かせるプレイヤー(Cube)がアイテム(Sphere)に触れると、そのアイテムがプレイヤーの前方にくっついて一緒に動くようになります。


具体的には以下のことを学べます:

  • Unityでの基本的なオブジェクト配置
  • オブジェクト間の親子関係の設定
  • 簡単なC#スクリプトを使った機能の実装

Unityの操作に慣れていなくても、この記事の手順に沿って進めれば大丈夫です!一緒に楽しく学びながら、プレイヤーがアイテムを取得する仕組みを作ってみましょう。それでは始めましょう!

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



2. オブジェクトの配置

Unityでゲーム開発を始める際には、まずは基本となるオブジェクトを配置する必要があります。このステップでは、プレイヤー(Cube)、地面(Plane)、そしてアイテム(Sphere)を配置する方法を説明します。以下の手順に沿って進めましょう!


1. 地面を作成(Planeの追加)

  1. Hierarchyビューで右クリックします。
  2. メニューから 3D Object > Plane を選択します。
  3. 追加されたPlaneが地面として機能します。

ヒント:
Planeは自動的に (0, 0, 0) に配置されます。この位置はそのままでOKです。


2. プレイヤーを作成(Cubeの追加)

  1. 再び Hierarchyビューで右クリック し、3D Object > Cube を選択します。
  2. 追加されたCubeがプレイヤーとなります。
  3. Cubeを選択し、Inspectorビューで「Add Component」ボタンをクリックします。
  4. 検索バーに「Rigidbody」と入力し、Rigidbodyコンポーネントを追加します。

Rigidbodyを追加することで、Cubeが物理的に動くようになります!

補足:
Cubeの位置は (0, 0.5, 0) に設定されることを確認してください。高さを0.5にすることで地面に浮いて見えます。


3. アイテムを作成(Sphereの追加)

  1. Hierarchyビューで右クリックし、3D Object > Sphere を選択します。
  2. 追加されたSphereがアイテムになります。
  3. InspectorビューでSphereの位置を次のように設定してください:
    • Position: 任意の位置(例: (2, 0.5, 0)

オプション:
見やすくするためにSphereに色を付けてみましょう。

  1. プロジェクトウィンドウで右クリックし、Create > Material を選択します。
  2. 新しいマテリアルを「RedMaterial」と名前を付けます。
  3. Inspectorビューで Albedo(色) を赤に設定します。
  4. このマテリアルをSphereにドラッグ&ドロップして適用します。

4. 見やすくするための設定

プレイヤー(Cube)も色を付けて見やすくしましょう。手順はSphereと同じです。
例えば、Cubeに青いマテリアルを適用して、プレイヤーであることをわかりやすくします。


これで、ゲームの基本的なオブジェクト配置が完了しました!次のステップでは、プレイヤーの前方に「透明なターゲット」を追加する方法を解説します。お楽しみに!



3. 透明なターゲットの設定

このステップでは、プレイヤー(Cube)の前にターゲットとなるオブジェクト(Target)を配置し、それを透明にする方法を説明します。透明なターゲットを使用することで、アイテム取得後の位置調整を簡単に行えます。


1. TargetをCubeの前に配置

  1. ターゲットオブジェクトの作成
    • Hierarchyビューで右クリックします。
    • 3D Object > Sphere を選択して、新しいSphereを作成します。
    • 作成したSphereの名前を「Target」に変更しましょう。
  2. 位置の調整
    • Inspectorビューで「Transform」のPositionを編集し、TargetをCubeの少し前方に配置します。例:
      • Position: (0, 0.5, 1)
        ※ Cubeのサイズに応じて調整してください。
  3. Cubeの子オブジェクトに設定
    • HierarchyビューでTargetをドラッグし、Cubeにドロップします。
    • これにより、TargetがCubeの子オブジェクトとして設定され、Cubeが動くとTargetも連動して動くようになります。

2. Targetを透明化

次に、Targetを透明にして、ゲーム画面で目立たないようにします。

  1. 透明マテリアルを作成
    • プロジェクトウィンドウで右クリックします。
    • Create > Material を選択して新しいマテリアルを作成します。
    • マテリアルの名前を「Toumei」に変更します。
  2. レンダリングモードを設定
    • 作成した「Toumei」マテリアルを選択し、Inspectorビューを開きます。
    • 以下の設定を行いましょう:
      • Rendering Mode: 「Fade」に設定
      • Albedo: カラーパレットの「A(アルファ)」値を0にスライドして透明にします。
  3. Targetに透明マテリアルを適用
    • HierarchyビューでTargetを選択します。
    • Inspectorビューの「Mesh Renderer」セクションにある「Material」欄に、「Toumei」マテリアルをドラッグ&ドロップします。

3. 動作確認

透明化の設定が完了したら、以下の点を確認しましょう:

  • ゲーム画面でTargetが目に見えない状態になっているか。
  • Cubeを動かすとTargetが連動して動くか。

これで、透明なターゲットの設定は完了です!次は、プレイヤーを動かすためのスクリプトを作成していきましょう。



4. プレイヤー(Cube)の動きの実装

このセクションでは、プレイヤーとして動かすCubeに「移動」と「回転」の機能を実装していきます。プレイヤーが自由に動けるようになることで、次の「アイテム取得の仕組み」をテストしやすくなります。それでは始めましょう!


CubeMoveスクリプトの作成

  1. スクリプトを作成
    まず、プロジェクトウィンドウで右クリックし、Create > C# Scriptを選択します。新しいスクリプトを作成したら、名前をCubeMoveに変更してください。
  2. CubeMoveスクリプトにコードを記述
    作成したスクリプトをダブルクリックして開き、以下のコードを記述してください。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CubeMove : MonoBehaviour
{
    void Update()
    {
        // 上キーで前進
        if (Input.GetKey("up"))
        {
            transform.position += transform.forward * 0.03f;
        }

        // 下キーで後退
        if (Input.GetKey("down"))
        {
            transform.position += transform.forward * -0.03f;
        }

        // 右キーで右回転
        if (Input.GetKey("right"))
        {
            transform.Rotate(0, 2, 0);
        }

        // 左キーで左回転
        if (Input.GetKey("left"))
        {
            transform.Rotate(0, -2, 0);
        }
    }
}

CubeMoveスクリプトをCubeにアタッチ

次に、スクリプトをCubeにアタッチして動きを設定します。

  1. Cubeを選択
    HierarchyビューでCubeをクリックして選択してください。
  2. スクリプトをアタッチ
    プロジェクトウィンドウでCubeMoveスクリプトを選択し、InspectorビューのCubeにドラッグ&ドロップします。これでスクリプトがCubeにアタッチされました。

実行して確認

スクリプトを設定したら、Unityエディタ上部の再生ボタンをクリックしてゲームを実行してみましょう。

  • キーボードの矢印キー(↑, ↓, ←, →)を押すことで、Cubeが動くはずです。
  • Cubeが前後に移動したり、左右に回転することを確認してください。

ポイント解説

  • 速度の調整
    コード内の0.03f2を変更することで、Cubeの移動速度や回転速度を調整できます。
  • 別のキーで操作する場合
    Input.GetKey("up")の部分を他のキー(例: ws)に変更することで、好みのキー設定にカスタマイズできます。

これで、Cubeを自由に動かすための基本的なスクリプトが完成しました。次は、この動くCubeを使ってアイテムを取得する仕組みを実装していきましょう!



5. アイテム取得の仕組みを実装

ここでは、プレイヤー(Cube)がSphere(アイテム)に触れると、アイテムをプレイヤーの前方に保持する仕組みを作成します。以下の手順に従って、スクリプトを作成して設定していきましょう!


1. スクリプトの作成

まずはアイテム取得の機能を実装するスクリプトを作成します。

  1. プロジェクトウィンドウで右クリック
    プロジェクトウィンドウで右クリックし、Create > C# Scriptを選択します。
  2. スクリプトに名前をつける
    スクリプト名を TouchObject に変更します。
  3. 以下のコードを記述する
    作成したスクリプトをダブルクリックして開き、以下のコードを記述します。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class TouchObject : MonoBehaviour
{
    public GameObject gameObject;  // Cube(プレイヤー)を指定する
    public GameObject target;      // Targetを指定する

    void OnCollisionEnter(Collision col)
    {
        // Cubeに触れた場合の処理
        if (col.gameObject.name == "Cube")
        {
            // Targetの位置にSphere(アイテム)を移動
            this.transform.position = new Vector3(target.transform.position.x, 0.5f, target.transform.position.z);

            // Cubeの子オブジェクトとして設定
            transform.SetParent(gameObject.transform);
        }
    }
}

2. スクリプトの設定

次に、作成したスクリプトをアイテム(Sphere)に設定し、必要なオブジェクトをリンクします。

  1. Sphereを選択
    HierarchyビューでSphereをクリックして選択します。
  2. Inspectorビューでスクリプトを追加
    Inspectorビューで「Add Component」ボタンをクリックし、TouchObjectスクリプトを検索して追加します。
  3. スクリプトのフィールドを設定
    • gameObject フィールドに Cube をドラッグ&ドロップします。
    • target フィールドに Target(透明なオブジェクト) をドラッグ&ドロップします。

これで、プレイヤーがアイテムを取得し、保持する機能の実装は完了です!次のセクションでは、完成した動作をテストプレイし、動作確認を行います。



6. テストプレイと動作確認

これまでのステップを終えたら、実際にゲームをプレイして、意図した動作を確認しましょう!以下の手順に従ってテストプレイを行います。


1. 再生ボタンをクリック

Unityエディタ上部にある再生ボタン(▶︎)をクリックして、ゲームを実行します。ゲームビューがアクティブになり、プレイヤー(Cube)を操作できるようになります。


2. プレイヤー(Cube)を移動させる

キーボードの矢印キーを使って、Cubeを移動させましょう。以下の動作を確認してください。

  • 上矢印キー: Cubeが前進します。
  • 下矢印キー: Cubeが後退します。
  • 右矢印キー: Cubeが右回転します。
  • 左矢印キー: Cubeが左回転します。

操作に違和感がないか、スムーズに動くかを確認してください。


3. Sphere(アイテム)に触れる

Cubeを操作して、Sphereに接触させます。このとき、以下の動作が正しく行われるか確認しましょう。

  • SphereがTargetの位置に移動しているか
    • SphereがCubeの前方に瞬時に移動しているはずです。
  • SphereがCubeの子オブジェクトになっているか
    • Hierarchyビューを確認して、SphereがCubeの子オブジェクトとして設定されていることを確認します。
  • SphereがCubeと一緒に動くか
    • Cubeを再び移動させて、SphereがCubeに追従していることを確認します。

4. エラーや意図しない動作がある場合

何か動作が期待通りにいかない場合、以下をチェックしてみてください。

  1. スクリプトの設定
    • TouchObjectスクリプトgameObjecttargetフィールドが正しく設定されているか確認します。
    • SphereのInspectorビューで、これらのフィールドが空白になっていないかチェックしましょう。
  2. オブジェクト名
    • CubeとSphereの名前がスクリプト内で指定されたものと一致しているか確認します。
  3. 物理設定
    • CubeとSphereの両方にColliderが正しく設定されているか確認します。
    • Cubeに追加したRigidbodyが有効になっているか確認してください。

すべてが正常に動作している場合、テストは完了です。お疲れさまでした!次はボールを持ったり置いたりする機能の追加をしてみましょう



7.ボールを持ったり置いたりする機能の追加

ここでは、プレイヤーがアイテム(Sphere)を持ったり置いたりする機能を実装します。この追加機能では、スペースキーを押すことで、アイテムを「持つ」または「置く」動作を切り替えることができます。


TouchObjectスクリプトの改良

以下のコードを、TouchObjectスクリプトに追加または修正してください。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class TouchObject : MonoBehaviour
{
    public GameObject gameObject;  // Cube(プレイヤー)を指定
    public GameObject target;      // Target(透明オブジェクト)を指定

    // オブジェクトが「リリース」されているかどうかを表すフラグ
    public bool isRelese; // オブジェクトが持たれていない状態の場合はtrue

    void Start()
    {
        // ゲーム開始時、オブジェクトは持たれていない状態に設定
        isRelese = true;
    }

    void Update()
    {
        // スペースキーが押されたときの動作
        if (Input.GetKeyDown(KeyCode.Space))
        {
            // オブジェクトがプレイヤーに保持されている状態(リリースされていない場合)
            if (!isRelese)
            {
                // 親子関係を解除して、オブジェクトをその場に置く
                transform.parent = null;
                // リリース状態に変更
                isRelese = true;
            }
        }
    }

    void OnCollisionEnter(Collision col)
    {
        if (col.gameObject.name == "Cube" && isRelese)
        {
            // Targetの位置にSphereを移動させる
            this.transform.position = new Vector3(target.transform.position.x, 0.5f, target.transform.position.z);
            // Cubeを親に設定して保持する
            transform.SetParent(gameObject.transform);
            // リリース状態を解除
            isRelese = false;
        }
    }
}

コードのポイント解説

  1. isReleseフラグ
    • オブジェクトがプレイヤーに持たれていない状態かどうかを判別するためのフラグ。
    • true の場合、オブジェクトは持たれていない。
    • false の場合、オブジェクトはプレイヤーに持たれている。
  2. Updateメソッド
    • スペースキーを押すことで、オブジェクトをその場に置く(リリース)動作を実行。
  3. OnCollisionEnterメソッド
    • オブジェクトがCubeに触れた際に、リリースされている状態であればアイテムを持つ。

スクリプトの設定

  1. TouchObjectスクリプトをSphereにアタッチ
    • HierarchyビューでSphereを選択。
    • Inspectorビューから「Add Component」をクリックし、TouchObjectスクリプトを追加。
  2. フィールドの設定
    • gameObject: Cube(プレイヤー)を指定。
    • target: 透明なTargetオブジェクトを指定。

テスト手順

  1. ゲームを実行して、プレイヤー(Cube)を操作します。
  2. Sphereに接触すると、SphereがCubeの前方に移動して保持されます。
  3. スペースキーを押すと、Sphereがその場に置かれます。
  4. 再度接触することで、Sphereを再び持つことができます。

期待する動作

  • プレイヤーがSphereに触れると、SphereがCubeの前方に保持される。
  • スペースキーを押すと、Sphereがその場に置かれる。
  • 再度Sphereに触れると、再びCubeがSphereを持つ。

これで、アイテムを持ったり置いたりする機能が完成しました!動作確認を行い、期待通りに動いているか確認してください。エラーや不具合がある場合はコメント欄でお知らせくださいね!



8. ボールをプレイヤーの正面に発射する機能を実装

この記事では、プレイヤーが保持したアイテム(ボール)を正面に向かって発射する仕組みを実装します。このステップでは、CubeMoveスクリプトTouchObjectスクリプトを編集し、スペースキーを押すことで保持しているボールをプレイヤーの進行方向に発射できるようにします。


CubeMoveスクリプトの編集

  1. スクリプトの編集箇所
    Cubeの前方方向を管理するdirectionという変数を追加し、リアルタイムで更新します。この変数を使うことで、現在の進行方向にボールを発射できるようになります。
  2. コード全体 以下のコードをCubeMove.csに記述または修正してください。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CubeMove : MonoBehaviour
{
    // プレイヤー(Cube)の進行方向を格納する変数
    public Vector3 direction; // Cubeの前方の方向を示す

    void Update()
    {
        // 毎フレームの開始時に、directionをCubeの前方方向に更新
        direction = transform.forward; // 現在の前方方向を取得して代入

        // "up"キーが押されている場合、Cubeを前方に移動させる
        if(Input.GetKey("up"))
        {
            transform.position += transform.forward * 0.03f; // 前方に0.03単位移動
        }

        // "down"キーが押されている場合、Cubeを後方に移動させる
        if(Input.GetKey("down"))
        {
            transform.position += transform.forward * -0.03f; // 後方に0.03単位移動
        }

        // "right"キーが押されている場合、Cubeを右回転させる
        if(Input.GetKey("right"))
        {
            transform.Rotate(0, 2, 0); // Y軸を基準に毎フレーム2度回転
        }

        // "left"キーが押されている場合、Cubeを左回転させる
        if(Input.GetKey("left"))
        {
            transform.Rotate(0, -2, 0); // Y軸を基準に毎フレーム-2度回転
        }
    }
}



TouchObjectスクリプトの編集

  1. スクリプトの編集箇所
    • ボールを保持している間はCubeの子オブジェクトとし、スペースキーを押すと保持を解除して発射します。
    • ボールを発射する際、Cubeの進行方向(CubeMoveスクリプトのdirection)を利用して力を加えます。
  2. コード全体 以下のコードをTouchObject.csに記述または修正してください。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class TouchObject : MonoBehaviour
{
    public GameObject gameObject; // プレイヤー(Cube)の参照を保持
    public GameObject target; // オブジェクトを保持する位置を示すターゲットオブジェクト
    public bool isRelese; // オブジェクトが保持されていない状態を示すフラグ
    public Rigidbody rb; // オブジェクトのRigidbodyを取得し、物理演算を行うために使用
    GameObject cube; // プレイヤー(Cube)オブジェクトを参照するための変数
    CubeMove ballDir; // Cubeの方向情報を取得するための変数

    void Start()
    {
        // ゲーム開始時、オブジェクトは保持されていない状態として設定
        isRelese = true;

        // Rigidbodyコンポーネントを取得
        rb = GetComponent<Rigidbody>();

        // "Cube"という名前のゲームオブジェクトをシーンから探して参照を取得
        cube = GameObject.Find("Cube");
    }

    void Update()
    {
        // スペースキーが押されたときの動作
        if (Input.GetKeyDown(KeyCode.Space))
        {
            // オブジェクトが保持されている場合にのみ実行
            if (!isRelese)
            {
                // 親子関係を解除して、オブジェクトをその場に置く
                transform.parent = null;

                // オブジェクトをリリース状態に変更
                isRelese = true;

                // Cubeの方向を取得するために、CubeMoveスクリプトを参照
                ballDir = cube.GetComponent<CubeMove>();

                // 取得した方向に基づいて、オブジェクトを前方に力を与えて投げる
                rb.velocity = ballDir.direction * 10.0f; // 速度を設定(10.0fは速度の大きさ)
            }
        }
    }

    void OnCollisionEnter(Collision col)
    {
        // オブジェクトがプレイヤー(Cube)に触れたときの処理
        if (col.gameObject.name == "Cube")
        {
            // オブジェクトを保持状態に設定
            isRelese = false;

            // オブジェクトの位置をターゲットオブジェクトの位置に合わせて配置
            this.transform.position = new Vector3(target.transform.position.x, 0.5f, target.transform.position.z);

            // プレイヤー(Cube)の子オブジェクトとして設定し、保持状態にする
            transform.SetParent(gameObject.transform);
        }
    }
}

動作確認

  1. ゲームを再生し、Cubeを移動させてボールに触れて保持します。
  2. スペースキーを押して、Cubeの進行方向に向けてボールが発射されることを確認します。
  3. 発射時の挙動が正しいか、速度や方向を調整したい場合はrb.velocityの値を変更してください。

これでプレイヤーが保持したボールを発射する機能が完成しました!お疲れさまでした!



よくある質問(FAQ)

Q
スクリプトを作成しましたが、動作しません。何が問題でしょうか?
A

いくつかの可能性があります。以下を確認してください:

  • スクリプトをアタッチするオブジェクトを正しく設定していますか?(例: CubeMoveスクリプトをCubeにアタッチ)
  • スクリプト内で指定しているオブジェクトの名前が正しいですか?(例: CubeTargetの名前)
  • コンパイルエラーがないか確認してください。Unityエディタの下部にエラーメッセージが表示されることがあります。
Q
アイテムがCubeの前に正しく配置されません。どうすれば修正できますか?
A

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

  • TouchObjectスクリプトの中で、targetフィールドにCubeの子オブジェクトであるTargetが正しく設定されていますか?
  • Targetの位置がCubeの前に配置されていることを確認してください。Targetの位置はInspectorビューで調整できます。
  • アイテム(Sphere)がPlane上にCubeに触れる位置に配置されていることを確認してください。
Q
Cubeが動きません。移動する方法をもう一度教えてください。
A

Cubeを動かすためには以下を確認してください:

  1. CubeにRigidbodyコンポーネントが追加されていることを確認してください。
  2. CubeMoveスクリプトがCubeにアタッチされていることを確認してください。
  3. スクリプト内での移動ロジックを再確認してください。特に以下のコード部分を見直してください:
    if(Input.GetKey("up")) { transform.position += transform.forward * 0.03f; }
    上記コードが意図したキー入力と一致していない場合、動きません。

おすすめのアセット

「Cartoon Items Pack Vol.2」は、カジュアルでかわいらしいデザインの3Dアイテムを豊富に収録したパックです。ゲーム内のアイテムとして使いやすく、低ポリゴンかつ鮮やかな色彩が特徴です。木材や石、宝箱など、さまざまなシーンに活用できるアイテムが揃っており、カートゥーンスタイルのゲームに最適です。Unityの主要レンダリングパイプラインに対応しており、軽量でパフォーマンスにも優れています。