UnityUnityメモ

Unity初心者向け!壁にぶつかると反対方向に跳ね返るオブジェクトを作ろう

Unity

1.はじめに

Unityでゲーム開発を始めると、「オブジェクトを動かしたい」「動いたオブジェクトが壁にぶつかったら跳ね返るようにしたい」といった動きを作りたくなることがありますよね。この記事では、そんな動きの基本となる「オブジェクトが壁にぶつかると反対方向に向きを変える」という仕組みをスクリプトを使って実現する方法を解説します。

初心者でも安心して取り組めるように、具体的な手順を1つずつわかりやすく説明していきます。また、Unityの基本操作やタグ、Colliderの使い方を学ぶこともできます。このチュートリアルを終えるころには、シンプルな物理挙動を活用して、ゲーム開発に役立つスキルを身につけられるでしょう!一緒に楽しみながら学んでいきましょう。

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



ステップ1:壁の準備

まず、オブジェクトがぶつかる「壁」をUnity上で作成していきましょう。この壁は、Cube(キューブ)を使って作ります。


1. 壁オブジェクトを作成する

  1. Hierarchyウィンドウで右クリックします。
  2. 表示されたメニューから**「3D Object」→「Cube」**を選択してください。
  3. 新しく作成されたCubeの名前を**「Wall1」**に変更します。

2. 壁のサイズと位置を調整する

  1. Inspectorウィンドウで以下の値を入力してサイズと位置を変更します。
    • Scale: (1, 3, 3)
      壁を縦長にして、ぶつかりやすくします。
    • Position: (-5, 0, 0)
      シーン内の左側に配置します。

3. 壁を衝突判定の対象にする

  1. Inspectorウィンドウ内のBox Colliderコンポーネントを確認してください。
  2. **「Is Trigger」**のチェックボックスにチェックを入れます。
    これにより、オブジェクトが壁に「触れた」ことを検出できるようになります。

4. 壁にタグを設定する

Unityで効率的にオブジェクトを管理するために、「タグ」を使います。

  1. Inspectorウィンドウの上部にある**「Tag」ドロップダウンメニュー**をクリックします。
  2. **「Add Tag」を選択し、新しいタグとして「Wall」**を追加します。
  3. タグが作成されたら、「Wall1」オブジェクトにこのタグを適用します。

5. 壁を複製して配置する

  1. Hierarchyウィンドウで**「Wall1」を右クリックし、「Duplicate」**を選択します。
  2. 複製されたオブジェクトの名前を**「Wall2」**に変更します。
  3. Inspectorウィンドウで位置を**(5, 0, 0)**に設定して、反対側に配置します。

これで、オブジェクトがぶつかる壁の準備ができました!次のステップでは、動くオブジェクトを作成していきましょう。



ステップ2:動くオブジェクトの準備

次は、壁にぶつかるオブジェクトを準備していきます。このオブジェクトが実際に移動し、壁に衝突することで跳ね返る動きを実現します。以下の手順に従って作業を進めましょう。


1. Cubeオブジェクトを作成

  1. Hierarchyウィンドウで右クリックします。
  2. メニューから「3D Object」→「Cube」を選択して新しいCubeを作成します。
  3. 作成したCubeの名前を「MovingCube」に変更します。

2. Rigidbodyを追加

  1. Inspectorウィンドウで「Add Component」ボタンをクリックします。
  2. 検索バーに「Rigidbody」と入力し、Rigidbodyコンポーネントを追加します。
  3. Rigidbodyの設定で「Use Gravity」のチェックを外します。
    • これにより、重力の影響を受けずに水平移動のみ行うようになります。

3. 子オブジェクトの作成

MovingCubeがどちらを向いているかを視覚的に分かりやすくするため、小さな子オブジェクトを追加します。

  1. Hierarchyウィンドウで「MovingCube」を右クリックします。
  2. 3D Object」→「Cube」を選択して子オブジェクトを作成します。
  3. 子オブジェクトを選択し、名前を「DirectionIndicator」に変更します。
  4. Inspectorウィンドウで以下の設定を行います:
    • Scaleを「(0.5, 0.5, 0.5)」に設定(小さくする)。
    • Positionを「(0.5, 0, 0)」に設定(親オブジェクトの前方に配置)。
  5. 見た目として、MovingCubeの正面に小さなCubeが付いた状態になります。

4. 見た目を調整(任意)

動きが分かりやすいように、以下の調整を行うと良いでしょう:

  • Materialを適用してMovingCubeとDirectionIndicatorの色を変える。
    • Projectウィンドウを右クリックし、「Create」→「Material」を選択して新しいマテリアルを作成。
    • MovingCubeとDirectionIndicatorにそれぞれ異なる色を適用する。

このステップを終えると、壁に向かって進むための準備が整います!次は、スクリプトで実際の動きを設定してみましょう。



ステップ3:スクリプト作成

それでは、オブジェクトが壁にぶつかったときに反対方向に向きを変えるスクリプトを作成しましょう。このスクリプトでは、UnityのC#スクリプトを使用してオブジェクトの挙動を制御します。

1. スクリプトを作成する

まず、新しいスクリプトを作成しましょう。

  1. Projectウィンドウを右クリックします。
  2. CreateC# Script を選択します。
  3. 作成されたスクリプトに「CubeMove」と名前を付けます。

2. スクリプトを編集する

次に、「CubeMove.cs」をダブルクリックして、スクリプトを編集します。以下のコードをコピーして貼り付けてください。

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

public class CubeMove : MonoBehaviour
{
    void Update()
    {
        // オブジェクトを前方に移動
        transform.Translate(new Vector3(0.1f, 0, 0));
    }

    private void OnTriggerEnter(Collider other)
    {
        // 壁に衝突した場合、反転する
        if (other.gameObject.tag == "Wall")
        {
            transform.Rotate(new Vector3(0, 180, 0));
        }
    }
}

3. コードの解説

コード内で使われている主な処理について簡単に説明します。

  1. Update()メソッド
    • 毎フレーム呼び出され、オブジェクトを前方に移動させる処理を行います。
    • transform.Translate()を使用して、オブジェクトを指定した方向(ここではX軸方向)に移動します。
  2. OnTriggerEnter()メソッド
    • 他のオブジェクト(壁)に触れたときに呼び出される処理です。
    • if (other.gameObject.tag == "Wall") の条件で、触れたオブジェクトが「Wall」タグを持つかどうかを判定します。
    • 壁に触れた場合、transform.Rotate()を使って180度回転させ、進行方向を反転します。



ステップ4:スクリプトの適用とテスト

それでは、作成したスクリプトをオブジェクトに適用して、実際に動作を確認してみましょう!


1. スクリプトをCubeにアタッチする

  • Hierarchyウィンドウで動くCube(メインのCube)を選択します。
  • Projectウィンドウから先ほど作成したスクリプト「CubeMove.cs」を選び、動くCubeにドラッグ&ドロップします。
  • Inspectorウィンドウで、Cubeにスクリプトが正しく追加されていることを確認してください。

2. プレイモードで挙動を確認する

  • Unityエディター上部にある**再生ボタン(▶)**をクリックして、プレイモードに切り替えます。
  • Cubeが指定した方向に動き始め、壁に触れると方向を変えて跳ね返る様子を確認しましょう。

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

もし期待通りに動かない場合は、以下を確認してください:

  1. タグ設定
    • 壁オブジェクト(Wall1、Wall2)に「Wall」タグが正しく適用されているか確認してください。
    • タグを新しく追加する際に、「Wall」という名前にスペルミスがないかもチェックしましょう。
  2. Rigidbodyの設定
    • 動くCubeにRigidbodyが追加されているか確認してください。
    • Use Gravityがオフになっているかも重要です。
  3. スクリプトの内容
    • CubeMove.csに書いたコードに誤りがないか確認してください。
    • 特に、if (other.gameObject.tag == "Wall")の部分が正しいかチェックしましょう。

4. テスト後の調整

  • 移動速度を変更したい場合は、CubeMove.cs内のtransform.Translateの数値を調整します。たとえば、new Vector3(0.05f, 0, 0)にすると、移動が遅くなります。
  • 壁の位置やサイズを変更して、Cubeの動きをテストするのも良い練習です。

プレイモードで正しく動作していれば、基本的な動きは完成です!次に、この動きを応用して、さらに複雑な動きを実現してみるのも楽しいですね。



よくある質問(FAQ)

Q
Rigidbodyを追加したのにCubeが動かないのはなぜ?
A

Rigidbodyを追加しただけではオブジェクトは動きません。動きを作るには、スクリプト内で transform.TranslateRigidbody.AddForce を使って移動させるコードが必要です。また、Rigidbodyの「Use Gravity」のチェックを外さないと、オブジェクトが重力の影響で下に落ちてしまうことがあります。この記事の手順通りに設定しているか確認しましょう。

Q
壁に触れても向きが変わらない場合の対処法は?
A

以下のポイントを確認してください:

  • 壁のオブジェクトにタグ「Wall」が正しく設定されているか。
  • スクリプト内でタグ名が正確に指定されているか。例:if (other.gameObject.tag == "Wall")
  • 壁のBox Colliderの「Is Trigger」にチェックが入っているか。
  • Cubeが正しくスクリプトをアタッチされているか。

これらを再確認し、修正すれば正しく動作するはずです。

Q
他のオブジェクトにも同じ動きを適用するには?
A

他のオブジェクトに同じ動きを適用したい場合は、以下の手順を試してください:

  1. CubeMoveスクリプトを複製したいオブジェクトにドラッグ&ドロップでアタッチします。
  2. 必要に応じてスクリプト内の設定(移動速度や回転角度など)をパラメータ化し、Inspectorで個別に調整できるようにします。例えば:public float moveSpeed = 0.1f; void Update() { transform.Translate(new Vector3(moveSpeed, 0, 0)); }

これにより、異なるオブジェクトごとに独自の設定が可能になります。

おすすめのアセット

「Survival Island | Template + Editor」は、Unityでサバイバルゲームを簡単に作成できるテンプレートです。このパッケージを使用することで、資源の収集、建物の建設、アップグレード、土地の探索、ミッション、報酬など、多彩な機能を持つゲームを効率的に開発できます。

主な特徴:

  • 地形システム: モジュール式の地形構築が可能で、特定エリアのロックやサブワールドの作成もサポートしています。
  • 資源収集: 木の伐採、石の採掘、草の刈り取り、釣りなど、多様な資源収集方法が用意されています。
  • 建物の建設とアップグレード: 資源を使って建物を建設し、さらにアップグレードすることで新たな機能を追加できます。

おすすめポイント:

  • 初心者でも使いやすい: 詳細なドキュメントと直感的なエディターにより、プログラミングの知識が少ない方でも簡単に操作できます。
  • カスタマイズ性: ゲームの要素を自由に変更でき、自分だけのオリジナルゲームを作成できます。
  • マルチプラットフォーム対応: Android、iOS、デスクトップ、WebGLなど、さまざまなプラットフォームでの動作が可能です。