前回のあらすじ
前回はミートピアのステージ制の仕組みを作るための全体設計や手順を考え、実際にカメラ追従対象の切り替え処理を実装しました。今回の記事では乗り物オブジェクトを移動させる仕組みを作ります。
前回の記事:https://qiita.com/Noise_Ark0104/items/4e717bcea5de004487d8
乗り物オブジェクトとは?
ミートピアは次のエリアへキャラが自動で向かう仕組みになっています。今回の開発では、その仕組みを借りて乗り物に乗ったキャラが次のエリアまで移動する処理を考えます。乗り物はファンタジー風のゲームなので小舟や馬など古典的なものにしたいと考えています。
スタート地点とゴール地点
スタート地点とゴール地点を決めるからのオブジェクトを用意してそこの位置を取得して乗り物オブジェクト動かします。
どうやって移動させる?
オブジェクトを移動させるにはRigidbody(物理演算)やTransformを使った方法がありますが、今回の実装は「直線移動」なのでRigidbodyは使わず、Transformを使った正確性の高い移動方法にします。
//乗り物オブジェクト用の移動クラス
using UnityEngine;
public class VehicleCtrl : MonoBehaviour
{
public Transform start;
public Transform goal;
public float moveSpeed;
void Update()
{
//移動の時だけ適用
if (TravelCtrl.Instance.State != VehicleState.Moving) return;
//現在地とゴール地点まで指定した一定速度で動かす
transform.position = Vector3.MoveTowards(
transform.position,
goal.position,
moveSpeed * Time.deltaTime
);
//ゴール地点との距離が極小になったら停止
if (Vector3.Distance(transform.position, goal.position) < 0.1f)
{
//代入するだけで追従対象が切り替わる
TravelCtrl.Instance.State = VehicleState.Idle;
}
}
}
MoveTowards()という関数を使いました。これを使えば名前の通り指定した場所まで進むことができます。また、Distance()でゴールとの距離を測定しオブジェクトが限りなくゴールに近くなったら停止してカメラの追従対象を変更します。
デバッグをする
今までやってこなかったデバッグをやっていきます。しっかりとカメラの追従対象が変わるか、オブジェクトが動くのかを確認します。
//デバッグ用
void Update()
{
if (Input.GetKeyDown(KeyCode.JoystickButton4))
{
//移動開始
TravelCtrl.Instance.State = VehicleState.Moving;
}
}
現時点ではどのような流れで乗り物移動に切り替えるか決めていないのでデバッグ用にボタンを押して切り替えるようにしました。(めんどくさがって旧Inputを使ってしまっています。いずれ新Inputに切り替えるつもりです。)
//CharacterManagerのStart()
TravelCtrl.Instance.State = VehicleState.Idle;
キャラクターは複数いてInterfaceで管理しています。そのため、CharacterManagerで現在のキャラが定まった後に状態をセットしないとエラーになってしまいます。
デバッグの結果は...
成功でした!!!!
デバッグ用のボタンのキーコードを適当に割り振ったため、どこのボタンを押したらいいのかわからなくてコントローラーをガチャガチャしていると切り替わりました。
通常時(キャラにカメラ追従)
移動時(移動用オブジェクトにカメラ追従+オブジェクトは動いています)
Goalオブジェクトまで移動するとキャラにカメラが戻ったので成功です。
基本的な動作は完成
形上ミートピアを再現できたと思います。ここからは完成度を高めるとともにオリジナリティを高めるために様々な要素を追加していきたいです。
次回予告:モンスター出現処理
次回は③モンスター出現処理です。(前回の記事では次の実装は優先度順で②のキャラ管理処理でしたが、後回しにした方が都合がいいことに気が付いたので飛ばします。)

