UnityUnityメモ

Unity初心者必見!オブジェクトを目的地に移動させるスクリプトの作成方法

Unity

はじめに

こんにちは!Unity初心者の皆さん、ゲーム開発を楽しんでいますか?今回は、Unityを使って「オブジェクトを目的地に移動させるスクリプト」を作成する方法をご紹介します。このスクリプトを使えば、キャラクターが自動的に目的地へ向かうような動きを簡単に実現できます。

ぜひ、この記事を参考にして、オブジェクトを動かす楽しさを体験してみてください!

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

1. 必要な準備

ここでは、スクリプトを動かすために必要なUnityシーンの準備方法を説明します。


1.1 Unityプロジェクトを作成

  1. Unityを起動
    Unity Hubを開き、「新しいプロジェクトを作成」をクリックします。
  2. テンプレートを選択
    テンプレートは「3D」を選択します。
  3. プロジェクト名を入力
    プロジェクト名を「MoveObject」と入力し、「作成」をクリックします。

1.2 シーンの準備

  1. ターゲットとなるオブジェクトを作成
    • ヒエラルキー(Hierarchy)ウィンドウで右クリックして「3D Object」→「Sphere」を選びます。
    • 作成されたSphereを「Target」という名前に変更します。
  2. 移動するオブジェクトを作成
    • 同じくヒエラルキーウィンドウで右クリックし、「3D Object」→「Cube」を選びます。
    • Cubeはそのままの名前で大丈夫です。
    • お好みでわかりやすいようにMaterialで色を変更してください。
  3. オブジェクトの位置を調整
    • ターゲット(Sphere)と移動するオブジェクト(Cube)が少し離れて配置されるように位置を変更します。
    • 位置の調整はヒエラルキーウィンドウでオブジェクトを選び、インスペクター(Inspector)ウィンドウ内の「Transform」コンポーネントの「Position」を編集します。
  4. カメラの調整(オプション)
    • メインカメラを選び、CubeとSphereが画面に映る位置に移動させます。



2. スクリプトの作成

Unityでオブジェクトを目的地に移動させるためのスクリプトを作成します。とてもシンプルなコードなので、Unity初心者でも簡単に実践できます!


2.1 スクリプトの準備

まずは新しいスクリプトを作成します。

  1. プロジェクトウィンドウを開きます(画面下部にあるウィンドウです)。
  2. ウィンドウ内で右クリックして「Create」→「C# Script」を選びます。
  3. スクリプト名を MoveTowardsTarget に変更してください。スクリプトの名前は他と区別しやすく、わかりやすいものにするのがおすすめです。

これでスクリプトファイルが作成されました。

2.2 コードの記述

作成したスクリプトをダブルクリックして開き、以下のコードをコピー&ペーストしてください。

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

public class MoveTowardsTarget : MonoBehaviour
{
    [SerializeField] GameObject target;
    private float speed = 3.0f;

    void Update()
    {
        //スタート位置、ターゲットの座標、速度
        transform.position = Vector3.MoveTowards(
          transform.position,
          target.transform.position,
          speed * Time.deltaTime);
    }
}

2.3 コードの解説

このスクリプトはとてもシンプルですが、重要なポイントがたくさんあります。

  1. [SerializeField]について
    この部分で、Unityエディタ上からターゲットを設定できるようにしています。これにより、コードを変更せずにターゲットオブジェクトを差し替えることができます。
  2. Vector3.MoveTowardsについて
    このメソッドを使うことで、現在の位置(transform.position)からターゲットの位置(target.transform.position)に向かって徐々に移動します。移動速度は speed * Time.deltaTime で制御しています。
  3. speed * Time.deltaTimeの理由
    UnityではTime.deltaTimeを使うことで、フレームレートに依存しない滑らかな移動が可能です。これにより、どんなPC環境でも同じスピードで動きます。

コード全体の説明

このコードは、Unityのゲームオブジェクトが特定のターゲットに向かって移動するスクリプトです。ターゲットは他のゲームオブジェクトで、このスクリプトを持つゲームオブジェクトがそのターゲットに向かって一定の速度で移動します。

各部分の説明

  1. ライブラリのインポート
    • System.CollectionsSystem.Collections.Genericは、コレクション(リストや配列など)を扱うためのライブラリです。
    • UnityEngineは、Unityの基本機能を使うためのライブラリです。
  2. クラスの定義
    • MoveTowardsTargetというクラスを作成しています。このクラスはMonoBehaviourを継承しているので、Unityのゲームオブジェクトにアタッチできます。
  3. 変数の宣言
    • targetは、ターゲットとなるゲームオブジェクトを指定するための変数です。[SerializeField]属性により、Unityエディター上で設定できます。
    • speedは、移動速度を示す変数です。ここでは、3.0fという値に設定されています。
  4. Updateメソッド
    • Updateメソッドは、毎フレーム(ゲームの1フレームごと)実行されます。
    • transform.positionは、このゲームオブジェクトの現在の位置を示します。
    • target.transform.positionは、ターゲットの位置を示します。
    • Vector3.MoveTowardsメソッドは、指定した速度で現在位置からターゲットの位置に向かって移動します。speed * Time.deltaTimeは、時間経過を考慮して移動速度を調整します。

全体の動き

  1. ゲームが始まると、スクリプトがアタッチされたゲームオブジェクトは毎フレームUpdateメソッドを実行します。
  2. Updateメソッド内で、Vector3.MoveTowardsメソッドが呼び出され、このゲームオブジェクトがターゲットに向かって少しずつ移動します。
  3. これにより、ゲームオブジェクトはターゲットの位置に向かって一定の速度で移動し続けます。

4. スクリプトを保存

コードを入力し終わったら、**Ctrl + S(Windows)またはCmd + S(Mac)**で保存します。



3. スクリプトの適用

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

まず、作成したスクリプトMoveTowardsTargetをCubeに適用しましょう。

  1. ヒエラルキーウィンドウでCubeを選択
    • シーン内の移動するオブジェクト(Cube)をヒエラルキーウィンドウでクリックして選択します。
  2. スクリプトをアタッチ
    • プロジェクトウィンドウで作成したMoveTowardsTargetスクリプトを見つけます。
    • そのスクリプトをドラッグして、ヒエラルキーウィンドウのCubeにドロップします。これでスクリプトがアタッチされました。


2. ターゲットを設定

次に、スクリプト内のTargetフィールドに、Cubeが向かう目的地を設定します。

  1. ターゲットをドラッグ&ドロップ
    • インスペクターウィンドウのMoveTowardsTarget (Script)セクションを見つけます。そこにTargetというフィールドがあります。
    • このフィールドに、ヒエラルキーウィンドウで作成したSphere(目的地のオブジェクト)をドラッグ&ドロップします。
  2. 確認
    • インスペクターウィンドウでTargetフィールドにSphereが設定されていることを確認します。



4. 実行してみよう

ここまで設定が完了したら、いよいよスクリプトを実行してみましょう!以下の手順に沿って動作を確認してみてください。


① プレイモードにする

  • Unityエディターの上部にある「Play」ボタンをクリックします。ボタンが青くなればプレイモードに入った証拠です。

② Cubeが動くのを確認する

  • プレイモード中に、CubeがゆっくりとSphereに向かって移動するのが確認できるはずです。
    CubeがSphereにたどり着いたら停止します。



Sphere(ターゲット)をクリックで移動させてみよう

今回作成したスクリプトは、ターゲット(Sphere)の位置が変わるたびに、Cubeがその新しい位置に向かって移動する仕組みになっています。こちらの記事を参考にターゲットを動かすと、クリックした場所にターゲットを移動させることができます。

この仕組みを使うと、プレイヤーが自由にクリックで目的地を指定してオブジェクトを動かすようなインタラクションが簡単に作れます。例えば、クリックでキャラクターを動かすゲームや、パズルゲームでの移動操作に応用できます!


さらにターゲットを透明のオブジェクトなどにするとこのような感じになります!

これで、ターゲットの位置を変えつつ、オブジェクトを動かす仕組みを理解できたとおもいます!次に挑戦するときは、このアイデアをベースにして、オリジナルのゲームを作ってみましょう!

まとめ

今回ご紹介したスクリプトを使えば、オブジェクトをターゲットに向かって移動させる簡単な仕組みを実装できます。これをベースに、速度を調整したり、ターゲットを動かしたりして、さらに遊び心のある動きを作ってみてください!


もし「もっと複雑な経路を探索させたい」「複数のオブジェクトを動かしたい」といった要望があるなら、Unity Asset Storeで人気のA* Pathfinding Project Proがおすすめです。このアセットは、Unityの標準機能を超える柔軟な経路探索機能を提供しており、広大なマップでも効率的にオブジェクトを移動させることができます。

たとえば、「キャラクターが障害物を回避しながら目的地に向かう」といった動きを簡単に実現できるため、RPGやシミュレーションゲームを開発したい方には特に役立ちます。シンプルなスクリプトに満足できなくなったら、ぜひチェックしてみてください!


よくある質問

Q
Cubeがターゲットに到達したときに何かをしたいのですが、どうすればいいですか?
A

A1: Updateメソッド内で、ターゲットとの距離をチェックし、十分に近づいたら処理を追加することができます。例えば、以下のようにします。

void Update()
{
    float step = speed * Time.deltaTime;
    transform.position = Vector3.MoveTowards(transform.position, target.transform.position, step);

    if (Vector3.Distance(transform.position, target.transform.position) < 0.001f)
    {
        // ここにターゲット到達時の処理を書く
        Debug.Log("ターゲットに到達しました!");
    }
}
Q
複数のターゲットを順番に移動したいのですが、どうすればいいですか?
A

配列やリストを使ってターゲットを管理し、1つのターゲットに到達したら次のターゲットに切り替えるようにスクリプトを変更します。

Q
ターゲットが動いている場合でも追いかけることができますか?
A

はい、ターゲットの位置を毎フレーム更新するので、ターゲットが動いている場合でも追いかけることができます。