【TopDown Engine】Room の作り方

MinimalRooms3D TopDown Engine
MinimalRooms3D

Unity の人気アセット TopDown Engine で Room を作成します。

Room の作り方

公式ドキュメント

(英語ですが)公式ドキュメントがありますので、詳しくはこちらをご覧ください。

Rooms | TopDown Engine Documentation
This page explains how the advanced rooms system works and how you can leverage it to link parts of your levels together...

デモ

TopDown Engine アセットに Room を使用するデモが用意されています。
こちらで、Room の動作を確認しましょう。
シーンの場所は、Assets/TopDownEngine/Demos/Minimal3D/MinimalRooms3D になります。

MinimalRooms3D
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のBoxCollider
RoomのBoxCollider
Room コンポーネント

Mode を Three D に設定します。
VirtualCamera に Room の Cinemachine カメラを設定します。
Confiner に子の Confiner オブジェクトを設定します。
CinemachineCameraConfiner に Cinemachine カメラの CinemachineConfiner コンポーネントを設定します。

Roomコンポーネント
Roomコンポーネント

Confiner

Layer を Ignore Raycast に設定します。

BoxCollider コンポーネント

IsTrigger のチェックを外します。
Center と Size に Cinemachine カメラの移動範囲を設定します。

ConfinerのBoxCollider
ConfinerのBoxCollider

CVCamera

CinemachineConfiner コンポーネント

BoundingVolume に Confiner オブジェクトを設定します。

CinemachineConfiner
CinemachineConfiner

Teleporter

BoxCollider コンポーネント

IsTrigger にチェックを付けます。
Center と Size に Teleporter の範囲を設定します。

TeleporterのBoxCollider
TeleporterのBoxCollider
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
Teleporter

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);
}
Cinemachineカメラ
Cinemachineカメラ

まとめ

TopDown Engine で Room を作成する方法をまとめました。
MinimalRooms3D でどのように実装すればいいのかを把握することができます。
うまく行かないところがあった場合は、Room や Teleporter を継承したクラスを作成して、自分が実現したい挙動に修正することも可能です。
うまく使いこなして楽しいゲームを作成していきましょう。

コメント

タイトルとURLをコピーしました