UnityUnityメモ

Unity初心者向け!床に触れている間だけ動く仕組みを作る方法

Unity

1.はじめに

この記事では、Unityを使って オブジェクトが床に触れているときだけ動く仕組み を作る方法を解説します。具体的には、Unityの Raycast 機能を利用して、オブジェクトが接地しているかどうかを確認し、条件を満たしている場合にのみ前進するシステムを構築します。

プログラミング初心者の方でもわかりやすいように、Unityの基本操作からC#スクリプトの記述方法まで丁寧に説明していきますので、安心して読み進めてください。

最後には、この仕組みを応用して動き方をカスタマイズする方法も紹介します。Unityの基本を押さえつつ、実際のゲーム開発にも役立つ知識を身につけましょう!

それでは、早速準備から始めましょう!

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



2. 準備:シーンのセットアップ

ここでは、Unityのシーンをセットアップする方法を解説します。具体的には、床としてのPlaneオブジェクトと、動く対象となるCubeオブジェクトを配置します。

1. 床を配置する

まずは、オブジェクトが接地する「床」を作りましょう。

  1. ヒエラルキーウィンドウを右クリックします。
  2. メニューが表示されるので、「3D Object」→「Plane」を選択します。
  3. シーンビューに大きな平面が追加されます。この平面が床として機能します。

ヒント:

  • Planeのサイズが小さいとオブジェクトが落ちてしまう可能性があります。必要に応じてスケールを調整してください。
    • スケールの変更方法:Planeを選択し、インスペクターウィンドウで「Scale」の値を変更します(例:X = 10, Y = 1, Z = 10)。

2. 動くオブジェクトを配置する

次に、床の上を動くオブジェクトを配置します。

  1. ヒエラルキーウィンドウを右クリックします。
  2. 3D Object」→「Cube」を選択します。
  3. シーンビューに立方体(Cube)が追加されます。このCubeが動く対象となります。

Cubeが床の上に乗っているか確認してください。もし床に埋まっていたり、浮いていたりする場合は、以下の手順で調整しましょう:

  • ヒエラルキーウィンドウでCubeを選択します。
  • インスペクターウィンドウの「Position」の値を調整します(例:Y = 0.5 に設定)。

これで、シーンに床と動くオブジェクトが配置できました!


次は、オブジェクトが床に触れているときだけ動く仕組みを作るためのスクリプトを作成します。



3. スクリプトの作成

この記事では、床に触れている間だけオブジェクトが動く仕組みを作るために、専用のC#スクリプトを作成します。以下の手順に従って進めてください。


1. スクリプトファイルを作成する

  1. プロジェクトウィンドウを開きます。
    Unityの画面下部または左下にある、アセットやスクリプトを管理する領域です。
  2. プロジェクトウィンドウの任意の空白部分を右クリックします。
  3. 表示されたメニューから次の順番で選択します:
    • CreateC# Script
  4. 新しいスクリプトファイルが作成されるので、名前を「MoveOnGround」と入力します。
    • ※スクリプト名を変更するときは、スペースを使わず、必ず一単語にしてください。

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

  1. 作成した「MoveOnGround」スクリプトをダブルクリックします。
    これで、Unityにリンクされたエディタ(通常はVisual Studio)が開きます。
  2. デフォルトで記載されているコードは削除し、以下のコードを入力してください。
using UnityEngine;

public class MoveOnGround : MonoBehaviour
{
    public float moveSpeed = 5f; // 前進速度

    void Update()
    {
        // オブジェクトの真下にRayを発射して接地を確認
        RaycastHit hit;
        if (Physics.Raycast(transform.position, Vector3.down, out hit, 1f))
        {
            // 床に接しているときは前進
            transform.Translate(Vector3.right * moveSpeed * Time.deltaTime);
        }
    }
}

3. コードの保存

エディタでコードを入力したら、必ず**Ctrl + S(Macの場合はCmd + S)**を押して保存します。


ポイント

  • Raycast: このコードでは、オブジェクトの下方向に「Ray」という仮想の線を発射して、床に触れているかどうかを確認しています。
  • moveSpeed: オブジェクトの移動速度を制御します。この値はUnityエディタから簡単に変更可能です。
  • transform.Translate: この関数を使って、オブジェクトを右方向(Vector3.right)に動かしています。

これでスクリプトの作成は完了です!次のステップでは、このスクリプトをUnityのオブジェクトにアタッチして動作させてみましょう。



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

「MoveOnGround」スクリプトを作成したら、それを動かしたいオブジェクト(今回はCube)にアタッチしていきます。


スクリプトをオブジェクトにアタッチする手順

  1. ヒエラルキーウィンドウでCubeを選択
    • ヒエラルキーウィンドウ内で、スクリプトを適用したいオブジェクト(今回はCube)をクリックして選択します。
    • Cubeが選択されている状態で、インスペクターウィンドウが開いていることを確認してください。
  2. スクリプトをドラッグ&ドロップ
    • プロジェクトウィンドウを開き、先ほど作成した「MoveOnGround」スクリプトを探します。
    • 「MoveOnGround」スクリプトを左クリックし、そのままインスペクターウィンドウのCubeにドラッグ&ドロップします。
  3. スクリプトがアタッチされたことを確認
    • Cubeを選択した状態でインスペクターウィンドウを確認すると、「MoveOnGround」というスクリプトコンポーネントが追加されているはずです。
    • このコンポーネントには「Move Speed」という項目が表示されており、ここでオブジェクトの移動速度を調整できます(デフォルト値は5)。

スクリプトアタッチ後の確認ポイント

  • スクリプトが適切にアタッチされているか確認
    • インスペクターウィンドウで「MoveOnGround」コンポーネントが表示されていない場合は、スクリプトのドラッグ&ドロップが正しく行われていない可能性があります。
  • スクリプト内のコードにエラーがないか確認
    • スクリプトがアタッチできない場合、エディターの下部にエラーメッセージが表示されていることがあります。エラー内容を確認し、修正してください。

これで、Cubeが床に触れている間だけ前進する準備が整いました!次はシーンを再生して動作を確認してみましょう。動作しない場合は、次のセクションでエラー解消のヒントを確認してください。



5. テストプレイ

さあ、ここまでの設定が完了したら、実際にスクリプトが正しく動作するかテストしてみましょう!

ステップ1: プレイモードを開始する

  1. Unityエディターの上部にある 再生ボタン(▶) をクリックして、プレイモードを開始します。
  2. シーンビューまたはゲームビューで、Cubeが床に触れている間だけ前進するかどうかを確認します。

ステップ2: 動作を観察する

  • 正常な動作
    Cubeが床に触れている間、右方向(デフォルトではX軸方向)に動き続けるはずです。床を離れると動作が停止します。
  • 動作しない場合のチェックポイント もし想定通りに動作しない場合は、以下を確認してみてください:
    1. Cubeの位置
      Cubeが床の上に配置されているか確認してください。床から離れている場合、Raycastが床を検出できません。
    2. スクリプトのアタッチ
      「MoveOnGround」スクリプトが正しくCubeにアタッチされているか確認してください。
      • Cubeをクリックして Inspector ウィンドウ を開き、スクリプトが表示されていることを確認します。
    3. Raycastの距離設定
      スクリプト内の以下の部分を確認してください:csharpコピーする編集するif (Physics.Raycast(transform.position, Vector3.down, out hit, 1f))1f はRayの長さを表します。もしCubeが床から少し離れている場合、この値を大きくしてみてください(例: 1.5f)。

ステップ3: 修正後の再テスト

問題を修正したら再度再生ボタンを押して、動作を確認してください。
問題がなければ、無事に床に触れている間だけCubeが動く動作が完成です!


このステップを通して、動作が確認できたら次のカスタマイズに進んでみましょう!「Cubeが特定の条件で動作する」仕組みを応用すれば、より複雑な動きやゲームのロジックを実装できますよ。



応用:カスタマイズのアイデア

ここでは、今回作成した「床に触れている間だけ動く」仕組みをさらに発展させるためのカスタマイズ方法を紹介します。少し手を加えるだけで、より複雑な動きや独自の動作を実現できます!


1. 動く方向を変更する

現在のスクリプトでは、オブジェクトが「右方向(Vector3.right)」にのみ移動するように設定されています。これを、別の方向に変える方法を解説します。

例えば、前方向(z軸方向)に動かしたい場合は以下のコードを変更します。

変更箇所:

transform.Translate(Vector3.right * moveSpeed * Time.deltaTime);

変更後:

transform.Translate(Vector3.forward * moveSpeed * Time.deltaTime);

他にも、ユーザー入力に応じて動く方向を切り替えることもできます。例えば、Input.GetAxisを使えばキーボード入力に対応した動きを実現できます。

サンプルコード:

float horizontal = Input.GetAxis("Horizontal");
float vertical = Input.GetAxis("Vertical");
Vector3 direction = new Vector3(horizontal, 0, vertical);
transform.Translate(direction * moveSpeed * Time.deltaTime);

2. Rayの距離を調整してより柔軟に

現在、Raycastの範囲は1メートルの距離(1f)に設定されています。この値を調整することで、より精密な接地確認やオブジェクトの高さに合わせた設定が可能です。

例:

if (Physics.Raycast(transform.position, Vector3.down, out hit, 0.5f)) // より近い範囲

また、高さに応じてRayの距離を動的に変更することもできます。


3. スクリプトを複数のオブジェクトに適用

作成したスクリプトは他のオブジェクトにも簡単に使えます。以下の手順で設定を確認してください。

  1. 複数のオブジェクトをシーンに配置(例:複数のCube)。
  2. 全てのオブジェクトに「MoveOnGround」スクリプトをアタッチ。
  3. Unityエディター内で各オブジェクトごとにmoveSpeedの値を調整して、それぞれ異なる速度で動かすことも可能です。

4. 条件を追加してさらに面白い動きに

例えば、床のタグ(Tag)を使って特定の床でのみ動作するように変更できます。

追加コード例:

if (Physics.Raycast(transform.position, Vector3.down, out hit, 1f))
{
if (hit.collider.CompareTag("Ground"))
{
transform.Translate(Vector3.right * moveSpeed * Time.deltaTime);
}
}

この方法を使うと、例えば「水たまりの床では動かない」や「特定の場所でスピードが変わる」などの条件付き動作が可能になります。


5. ビジュアルエフェクトの追加

移動時にエフェクトを追加すれば、動きがさらに目立ちます。例えば、移動時に足元でダストエフェクトを再生する場合:

  1. Particle Systemを作成して、ダストのエフェクトを設定。
  2. スクリプト内で以下を追加。public ParticleSystem dustEffect; void CreateDust() { dustEffect.Play(); }
  3. if文内にCreateDust()を呼び出して、Raycastで接地したときのみエフェクトが再生されるようにします。

これらのカスタマイズを活用して、オリジナリティのある動きを作り出してみてください!少しの工夫で、ゲーム内での表現の幅が大きく広がります。



よくある質問(FAQ)

Q
Raycastが機能しない場合はどうすればいいですか?
A

Raycastが機能しない場合、以下を確認してください:

  • オブジェクトの高さ: Raycastが届く範囲(スクリプトでは1fに設定)に床がない場合、接地を検知できません。Cubeの高さや床との距離を調整してください。
  • 床オブジェクトにColliderが付いているか: Planeや他の床オブジェクトにはColliderが必要です。なければ「Inspector」ウィンドウで「Box Collider」や「Mesh Collider」を追加してください。
  • Raycastの方向: スクリプトでVector3.downを使用していますが、Cubeの位置や回転が不正確だとRayが意図した方向に発射されないことがあります。「Scene」ビューで確認してください。
Q
スクリプトが動作しない場合、どこを確認すればいいですか?
A

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

  • スクリプトが正しいオブジェクトにアタッチされているか: Cubeを選択し、「Inspector」ウィンドウでスクリプトが表示されていることを確認してください。
  • スクリプト内のエラー: Visual Studioやエディタにエラーが表示されていないか確認してください。特にスペルミスやカッコの閉じ忘れに注意しましょう。
  • スクリプトの有効化: スクリプトを無効にしていると動作しません。「Inspector」ウィンドウでスクリプトが有効(チェックボックスがオン)になっているか確認してください。
Q
動くスピードを調整する方法は?
A

スクリプト内のmoveSpeed変数を変更することで調整できます。例えば、以下のように変更すると動きが速くなります:

public float moveSpeed = 10f; // 速く移動
  • また、「Inspector」ウィンドウでスクリプトを選択すると、Move Speedという項目が表示されるので、そこから直接値を変更することも可能です。これにより、コードを編集せずにリアルタイムで速度を調整できます。

おすすめのアセット

「2D+3D Infinite Runner Engine」は、Unityで2Dおよび3Dの無限ランナーゲームを簡単に作成できる強力なツールです。このエンジンを使用することで、複雑なプログラミングなしに、高品質なエンドレスランナーゲームを開発できます。

主な特徴:

  • 2Dと3Dの両方に対応: 2Dおよび3Dのゲームプレイをサポートし、多様なゲームスタイルに適応します。
  • 多彩なサンプルゲーム: プラットフォーマーやレーンランナーなど、さまざまなゲーム例が含まれており、学習やプロトタイプ作成に役立ちます。
  • モバイル対応: タッチデバイス向けの操作が組み込まれており、スマートフォンやタブレットでも快適に動作します。

おすすめポイント:

  • 初心者でも使いやすい: 複雑なコードを書く必要がなく、直感的な操作でゲーム開発が進められます。
  • 時間の節約: 基本的なゲームシステムが揃っているため、開発時間を大幅に短縮できます。
  • 高品質なサポート: 開発者からのサポートがあり、安心して利用できます。