Developer

【Unity実践】#5 曲線に沿って移動させる【ランゲーム】
2021.09.04
Lv2

【Unity実践】#5 曲線に沿って移動させる【ランゲーム】

今回の内容

今回は第3回の記事で Bézier Path Creator を使って作成したコース上を動くオブジェクトを作成します。

アセットストア
Bézier Path Creator

※初めての方はこちらから
【第1回記事】導入とサンプルの紹介

準備

準備としてテスト用のオブジェクトを用意します。
Create Empty で空のオブジェクトを作成して名前は MovementBase、位置は(0, 0, 0)とします。
その子要素として Cube を追加し、位置を(0, 0.5, 0)とします。

シーンで見た時にスタート地点(Rode Mesh Holder の端)に配置されていれば上手く作成できています。

Bézier Path Creator の経路上を移動するスクリプト

経路に沿って移動するには Bézier Path Creator で用意されているクラス、メソッドを使用します。

ProjectビューでAssets直下に Scripts フォルダを作成しましょう。
その中に新規スクリプトを作成し、名前は MovementBaseScript とします。

中身を開き、以下を記述してください。

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

public class MovementBaseScript : MonoBehaviour
{
    [SerializeField]
    PathCreator pathCreator;

    float speed = 6f;
    Vector3 endPos;

    float moveDistance;

    void Start()
    {
        endPos = pathCreator.path.GetPoint(pathCreator.path.NumPoints - 1);
    }

    void Update()
    {
        moveDistance += speed * Time.deltaTime;
        transform.position = pathCreator.path.GetPointAtDistance(moveDistance, EndOfPathInstruction.Stop);
        transform.rotation = pathCreator.path.GetRotationAtDistance(moveDistance, EndOfPathInstruction.Stop);
    }
}

短いスクリプトですが、pathCreator 関連の記述は Bézier Path Creator 側で用意されたクラスを使用しており、
標準のUnity C# には無い見慣れない記述となっていますので以下で解説します。

① 18行目について
内容としては経路の最終地点の座標を endPos に代入しています。
最終地点を取得するに当たって、アセットが提供する GetPointメソッドを使用しており、
これは引数に経路上の地点のインデックスを指定することで、その位置を取得できるメソッドです。

経路上の地点のインデックス・・?と思われたかもしれませんが、
Bézier Path Creator の経路は仕組みとしては多数の点を結ぶことで1つの曲線を表現しています。
※この点と言うのは第3回の記事で登場した赤や青の点とは別の物です。

以下画像がイメージとなります。
(実際には点が密に配置されています。)

pathCreator.path.NumPoints が経路上の点の数(画像の赤点)なので、マイナス1することで最後の点の番号を指定しています。
この変数は現段階では未使用ですが、次回以降の記事で使用しますので先に記述しておきます。

② 24行目について
ここではやはりアセットが提供する、GetPointAtDistanceメソッドを使用しており、
やっていることは開始地点からの経路上の距離を指定することで、その点の座標を取得しています。

第1引数:開始地点からの経路上の距離
第2引数:最終地点を超える距離を指定した場合の動作(今回は超えたら最終地点を指す設定)

こちらも以下がイメージとなります。
経路の全長が100の場合に、第1引数に50を指定すると、中間の点の座標を取得することができます。

このスクリプトでは第1引数には moveDistance という変数を指定していますが、
これは23行目で計算している通り、速度の大きさが speed の場合のシーンを開始してからの移動距離となります。

まとめると、その時刻(開始からの経過秒数)における経路上を動く物体の位置を取得しているのが、24行目の処理です。

③ 25行目について
アセットが提供する、GetRotationAtDistanceメソッドを使用しており、
これは ② の GetPointAtDistance が位置を取得したのに対して、回転を取得するメソッドとなります。
これによって、経路上のどこにいても、物体が進行方向を向くようにしています。

動作確認をしてみる

先ほど作成したスクリプトを MovementBaseオブジェクトにアタッチします。
さらに、Inspectorビューで MovementBaseScript の PathCreator に、シーン内にある PathCreatorオブジェクトを設定します。

シーンを再生し、以下の様に経路に沿って移動ができていれば成功です。

おわりに

ようやく移動の仕組みの初期段階が作成できました。
この連載の中では初めて C#スクリプトが登場したので少し大変だったかもしれません。

次回はキューブをユニティちゃんに置き変えていきたいと思います!

 

 
関連リンク ➡ 「初心者のための」Unityゲーム制作 目次

© Unity Technologies Japan/UCL