Unity の人気アセット TopDown Engine で Room を作成します。
Room の作り方
公式ドキュメント
(英語ですが)公式ドキュメントがありますので、詳しくはこちらをご覧ください。
デモ
TopDown Engine アセットに Room を使用するデモが用意されています。
こちらで、Room の動作を確認しましょう。
シーンの場所は、Assets/TopDownEngine/Demos/Minimal3D/MinimalRooms3D になります。
概要
Room とは
シーン内にある空間を分割して管理する単位を Room といいます。
カメラの移動を Room 内だけに制限したり、Room への出入りのタイミングで特殊な処理を行ったりできるようになります。
Teleporter とは
Teleporter は、複数の Room 間を移動する機能を提供します。
Room の移動による Cinemachine カメラの切替や、移動中にフェードを入れたりできます。
ヒエラルキーの例
例として、複数の Maze(迷路)を作成し、1つの Maze を Room として管理することにしました。
Maze1、Maze2、…… に Room コンポーネントを追加しています。
Maze1Teleporter1、Maze1Teleporter2、…… に Teleporter コンポーネントを追加しています。
Room を作成する手順
LevelManager
LevelManager コンポーネントの UseLevelBounds のチェックを外します。
Room
BoxCollider コンポーネント
IsTrigger にチェックを付けます。
Size に Room のサイズを設定します。
Room コンポーネント
Mode を Three D に設定します。
VirtualCamera に Room の Cinemachine カメラを設定します。
Confiner に子の Confiner オブジェクトを設定します。
CinemachineCameraConfiner に Cinemachine カメラの CinemachineConfiner コンポーネントを設定します。
Confiner
Layer を Ignore Raycast に設定します。
BoxCollider コンポーネント
IsTrigger のチェックを外します。
Center と Size に Cinemachine カメラの移動範囲を設定します。
CVCamera
CinemachineConfiner コンポーネント
BoundingVolume に Confiner オブジェクトを設定します。
Teleporter
BoxCollider コンポーネント
IsTrigger にチェックを付けます。
Center と Size に Teleporter の範囲を設定します。
Teleporter コンポーネント
AutoActivation にチェックを付けます。
ExitOffset に移動先の Room に移動したときの座標オフセットを設定します。
TeleportationMode を Tween に設定します。
TweenCurve を Linear Tween に設定します。
Maintain X/Y/Z Entry Position On Exit のチェックを適切に設定します。
Destination に移動先の Teleporter を設定します。
AddToDestinationIgnoreList にチェックを付けます。
CameraMode を Cinemachine Priority に設定します。
CurrentRoom に移動元の Room を設定します。
TargetRoom に移動先の Room を設定します。
Teleporter の IgnoreList について
Teleporter コンポーネントの AddToDestinationIgnoreList にチェックを付けると、移動先の Room に移動している間は、移動先の Teleporter が反応しないようになります。
しかし、移動先の Room に移動が完了した後も IgnoreList に登録されたままになってしまいます。
下記のように MyTeleporter を作成して、IgnoreList から登録を削除するようにしました。(AfterDelayBetweenFades 参照)
ついでに、現在の Room とは関係ない Teleporter が反応しないようにもしてみました。(TriggerEnter 参照)
namespace MoreMountains.TopDownEngine {
[AddComponentMenu("TopDown Engine/Environment/MyTeleporter")]
public class MyTeleporter : Teleporter {
protected override void TriggerEnter(GameObject collider) {
if (! CurrentRoom.CurrentRoom) {
// 今いる Room ではない.
return;
}
base.TriggerEnter(collider);
}
protected override void AfterDelayBetweenFades(GameObject collider) {
if (AddToDestinationIgnoreList) {
// IgnoreList から削除する.
Destination.RemoveFromIgnoreList(collider.transform);
}
base.AfterDelayBetweenFades(collider);
}
}
}
Room を移動したときのカメラの回転操作について
Room のカメラを回転させる手順
プレイヤーキャラに CharacterRotateCamera コンポーネントを追加します。
Cinemachine カメラの CinemachineVirtualCamera コンポーネントの Body に Framing Transposer を設定します。
Cinemachine カメラの CinemachineVirtualCamera コンポーネントの Aim に Do nothing を設定します。
移動先の Room でカメラを回転できない問題の対処方法
Room を移動して Cinemachine カメラを切り替えたときに、カメラが回転できなくなってしまいました。
CharacterRotateCamera が Cinemachine カメラの切替に対応していないようでした。
仕方がないので、Room にそれぞれ用意した Cinemachine カメラは無効にして、Minimal3DCameras に入っている Cinemachine カメラだけを使用するようにしました。
そうすると、Room を移動したときの Confiner が切り替わらないので、Room に入ったときに Confiner を切り替える処理を追加しました。
下記のコードが実装例になります。
private void OnEnable() {
m_rRoom1.OnPlayerEntersRoomForTheFirstTime.AddListener(UpdateRoom1Confiner);
m_rRoom2.OnPlayerEntersRoomForTheFirstTime.AddListener(UpdateRoom2Confiner);
m_rRoom1.OnPlayerEntersRoom.AddListener(UpdateRoom1Confiner);
m_rRoom2.OnPlayerEntersRoom.AddListener(UpdateRoom2Confiner);
}
private void OnDisable() {
m_rRoom1.OnPlayerEntersRoomForTheFirstTime.RemoveListener(UpdateRoom1Confiner);
m_rRoom2.OnPlayerEntersRoomForTheFirstTime.RemoveListener(UpdateRoom2Confiner);
}
private void UpdateRoom1Confiner() {
MMCameraEvent.Trigger(MMCameraEventTypes.SetConfiner, null, m_rConfiner1);
}
private void UpdateRoom2Confiner() {
MMCameraEvent.Trigger(MMCameraEventTypes.SetConfiner, null, m_rConfiner2);
}
まとめ
TopDown Engine で Room を作成する方法をまとめました。
MinimalRooms3D でどのように実装すればいいのかを把握することができます。
うまく行かないところがあった場合は、Room や Teleporter を継承したクラスを作成して、自分が実現したい挙動に修正することも可能です。
うまく使いこなして楽しいゲームを作成していきましょう。
コメント