🚀前回のあらすじ
前回はトーク処理を実装しました。設計が甘く、バグの修正でかなり時間がかかりました。ですが、今回はそうはいかせません。
何を作っているか詳しく知りたい人は、1の記事をご覧ください。
🎯今回
今回は今まで飛ばしていた②の実際に乗り物に乗っているキャラの実装です。ただ乗っているのではなく、どのキャラが乗るのか、どこに乗るのかを管理できるような設計を構築します。
🧩キャラ管理処理
乗り物をプレハブ化して、移動処理が開始すると生成するようにします。それと同時に、キャラの乗り物に乗っている状態のスプライトを持ったプレハブも生成します(キャラの操作用オブジェクトは既に様々な機能が実装されていて、管理が難しいので別々にします)。また、キャラによって乗り物の定位置を定め、そこに固定します。
🛠️具体的にどんな処理を実装する?
前提として、操作キャラと乗っている状態のプレハブは結びつける必要がありません。場所による会話の内容や会話を行うキャラはストーリーで決定するからです。まず、ScriptableObjectで座っている状態のスプライト、定位置を示すインデックスを定義します。移動の開始を含めた処理を持つ管理マネージャーで指定した乗り物プレハブと、乗っているキャラプレハブ(複数なので配列)を定義します。乗り物プレハブには乗り物オブジェクトと、定位置を示すオブジェクトを配列で管理します。
📦データ化
まずは操作キャラと結びつけるためのデータをScriptableObjectで定義します。
[CreateAssetMenu(menuName = "Game/TravelCharacterData")]
public class TravelCharacterData : ScriptableObject
{
public GameObject sittingPrefab; // 乗り物に座っているプレハブ
public int seatIndex; // どの座席に座るか
}
これはキャラのデータです。
public class PartyCtrl : MonoBehaviour
{
[Header("この拠点で乗るキャラ")]
public List<TravelCharacterData> partyMembers;
[Header("この拠点で使う乗り物")]
public VehicleCtrl vehiclePrefab;
}
これが管理用のクラスです。キャラデータの配列のみ定義して外部から参照します。
public Transform[] seatPoints;//乗り物の子オブジェクト
🏗️プレハブ生成処理
乗り物プレハブとキャラのプレハブはどちらもTravelCtrl.csで生成します。今まで手動でやっていた移動開始もこのメソッドを呼び出すことで自動的に行うようになります。
public void StartTravel(PartyCtrl partyCtrl, Transform start, Transform goal)
{
//乗り物生成
vehicle = Instantiate(partyCtrl.vehiclePrefab, start.position, Quaternion.identity);
//ゴール位置受け渡し
vehicle.goal = goal;
foreach (var data in partyCtrl.partyMembers)
{
var seat = vehicle.seatPoints[data.seatIndex];//位置を示す空オブジェクト
GameObject obj = Instantiate(
data.sittingPrefab,
seat.position,
Quaternion.identity,
seat//これの子オブジェクトとして生成
);
}
//移動開始処理もここで行う
State = VehicleState.Moving;
}
🎮呼び出し
まだどのような流れで移動処理に入るか決めていないので、ひとまずはTriggerを使います。乗り物をプレハブ化したため、スタート・ゴール地点はここで定義・参照します。
//追加
[Header("スタート地点")]
public Transform start;
[Header("ゴール地点")]
public Transform goal;
//デバッグ用
void OnTriggerEnter(Collider other)
{
if (!other.gameObject.CompareTag("Character"))
return;
if (TalkCtrl.Instance.IsTalking)
return;
//移動開始
TravelCtrl.Instance.StartTravel(this, start, goal);
}
これでコーディングは完了です。
🔍デバッグ
まずは準備からやっていきます。

キャラのプレハブです(座っている状態のスプライトをまだ用意していないので立っている状態ですが)。
そして、

このようにアセットを作ります。ひとまず1キャラでも処理が正しく動けば間違いなしです。
また、定位置のオブジェクトを乗り物オブジェクトの子にして、それをプレハブ化します。
スクリプトにオブジェクトなどをアタッチすれば準備完了です。
実際にデバッグします。

灰色の立方体が乗り物プレハブです。一応成功しているように見えます。
しかし、キャラの見た目が異常です。

これは検証した結果、親オブジェクトの大きさに依存していることが原因でした。これは、これから作る乗り物のモデル自体のを大きくすればよいのでひとまずこれで実装完了です。
🎨モデル・スプライトはいつ作るか...
モデル・スプライト製作は自分の専門外なので、作るとなったらとても大変に思います(もうすでにあるキャラのスプライトについては、時間をかけて奇跡的にうまくいったものです)。なのでこの分野は別記事でまとめようと思います。
💬感想
今回は自分の実装力でかなり余裕をもって作れました。しかし、集中力が続かずだらだらとコーディングしていたので時間はかなりかかりました。あとはもう少し具体的な設計図を紙に書いておいた方が効率的にコーディングができると感じました。これからはそれをやっていきたいです。
🔮次回予告
次回はエリア処理です。これは以前も設計をしていて、今までやった設計に近いものだと思うので集中して早く実装できるようにしたいです。次回からは仕上げ作業のような感覚で行っていきます。Thank You For Reading!
✨今までの記事
本シリーズの別パートもぜひご覧ください。
Unityで制作中のRPGにミートピアのようなステージ制の仕組みを実装したい1
Unityで制作中のRPGにミートピアのようなステージ制の仕組みを実装したい2
Unityで制作中のRPGにミートピアのようなステージ制の仕組みを実装したい3
Unityで制作中のRPGにミートピアのようなステージ制の仕組みを実装したい4