引き続き、2DのRPGを作っています。
バトルシーンは新しいSceneで作る
最初に迷ったのが、バトルシーンは、新しいSceneを作り、マップ画面から遷移させるのか、それとも、どこかに座標にバトル画面を作っておいて、その座標に移動するような実装がいいのか?ということです。AIに聞いたら、新しいシーンを作成した方が良いとのことでした。
2dRPGで、敵との戦闘画面を作りたいと思いますが、その場合、マップ画面と切り分けたSceneを作るのか、それとも座標を変えた場所に戦闘画面を作って座標を変えるのか、どちらが一般的ですか?
【回答】
2D RPGで敵との戦闘画面を作る場合、一般的にはマップ画面と切り分けたSceneを作る 方法が採用されます。
Sceneを分けるメリット
- 管理のしやすさ: マップ画面と戦闘画面で必要なオブジェクトやスクリプトが異なるため、Sceneを分けることで整理しやすくなります。
- パフォーマンス: マップ画面には不要な戦闘画面の要素を読み込む必要がないため、メモリ使用量を抑え、パフォーマンスを向上させることができます。
- 演出の自由度: Scene遷移を活用することで、フェードイン/アウトなどの演出を効果的に取り入れることができます。
- 開発効率: Sceneを分けることで、マップ画面と戦闘画面を並行して開発しやすくなります。
座標を変える方法のデメリット
- 管理の複雑さ: すべての要素が1つのSceneに存在するため、オブジェクトの管理やスクリプトの制御が複雑になりがちです。
- パフォーマンスの低下: 戦闘に関係ないオブジェクトも常にメモリ上に存在するため、パフォーマンスが低下する可能性があります。
- バグのリスク増加: オブジェクトの座標操作による予期せぬバグが発生する可能性があります。
ということで、バトルシーンを作成し、NPCと会話後に遷移する機能を実装します。
バトルシーン作成・NPCと会話後に遷移
- バトルシーン (BattleScene) の作成
- 新規シーンを作成し、”BattleScene” という名前を付ける。
- 背景画像、UI要素 (体力ゲージ、コマンドウィンドウなど)、キャラクターの画像などを配置する。
- 会話シーンからの遷移
MessageCharactor
スクリプトにバトルフラグisBattleCharacter
を追加する。- インスペクタで、バトルキャラクターに
MessageCharactor
スクリプトをアタッチし、isBattleCharacter
を true に設定する。 MessageCharactor
スクリプトにTransitionToBattleScene()
メソッドを追加し、SceneManager.LoadScene("BattleScene")
でバトルシーンへ遷移する処理を記述する。- 会話終了後、
isBattleCharacter
が true の場合にTransitionToBattleScene()
を呼び出すようにする。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement; // SceneManagerを使うために追加
public class MessageCharactor : FieldObjectBase {
[SerializeField]
private List<string> messages;
[SerializeField]
private bool isBattleCharacter = false; // バトルフラグ
protected override IEnumerator OnAction() {
for (int i = 0; i < messages.Count; ++i) {
yield return null;
showMessage(messages[i]);
yield return new WaitUntil(() => Input.anyKeyDown);
}
// 会話終了後、バトルフラグが立っている場合はバトルシーンへ遷移
if (isBattleCharacter)
{
TransitionToBattleScene();
}
yield break;
}
// バトルシーンへ遷移するメソッド
private void TransitionToBattleScene()
{
SceneManager.LoadScene("BattleScene");
}
}
これで、NPCキャラクターとの会話後に、戦闘フラグを立てたキャラの場合は戦闘シーンに移行できます。