2DRPGを作っていたら、町から家の中や1階から2階などに切り替える方法がわからないことに気が付きました。
しかも、ただ切り替えるだけではなく、町の中のある家の扉付近から、その家の中の扉の前と位置を指定してシーンを切り替える必要が出てきました。
今回は、その際に実装した方法についてメモを残しておこうと思います。
やりたいこと
- フィールド間を移動させたい
準備するもの
操作できるキャラクタの設定
キャラクターの設定は以下のものを使用します。
a1026302.hatenablog.com
切り替え用のSceneを2つ
シーンを切り替えたいので、事前に2つSceneを準備して、「Scenes In Build」にシーンを登録しておきます。
「Scenes In Build」の登録は、メニューの「File」->「Build Settings」をクリックすると「Build Settings」というサブウィンドウが表示されるので、そこから登録します。
Projectから使用するシーンをドラック&ドロップすることを登録することができます。
設定
出口と入口を作成します。
スクリプト準備
出口のスクリプト作成
出口のスクリプトを作成します。
このスクリプトは、切り替え先のシーン名と遷移名を指定することで、切り替え先のシーンの入り口にPlayerを移動させるものです。
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.SceneManagement; public class AreaExit : MonoBehaviour { public string areaToLoad; public string areaTransitionName; public AreaEntrance theEntrance; public float waitToLoad = 1f; private bool shouldLoadAfterFade; // Start is called before the first frame update void Start() { theEntrance.transitionName = areaTransitionName; } // Update is called once per frame void Update() { if(shouldLoadAfterFade) { waitToLoad -= Time.deltaTime; if(waitToLoad <= 0){ shouldLoadAfterFade = false; SceneManager.LoadScene(areaToLoad); } } } private void OnTriggerEnter2D(Collider2D other) { if(other.tag == "Player") { // SceneManager.LoadScene(areaToLoad); shouldLoadAfterFade = true; GameManager.instance.fadingBetweenAreas = true; UIFade.instance.FadeToBlack(); PlayerController.instance.areaTransitionName = areaTransitionName; } } }
入口のスクリプト作成
入口のスクリプトを作成します。
using System.Collections; using System.Collections.Generic; using UnityEngine; public class AreaEntrance : MonoBehaviour { // Start is called before the first frame update public string transitionName; void Start() { if(transitionName == PlayerController.instance.areaTransitionName) { PlayerController.instance.transform.position = transform.position; } UIFade.instance.FadeFromBlack(); if(GameManager.instance != null) { GameManager.instance.fadingBetweenAreas = false; } } // Update is called once per frame void Update() { } }
出入口のGameObject設定
移動させたいシーンにそれぞれ出口と入口が親子関係のゲームオブジェクトを作成します。
出口のGameObject
「Area Exit」というゲームオブジェクトを作成します。
「Area Exit」というゲームオブジェクトの「Transform」コンポーネント「Position」から位置を指定します。
「Area Exit」に「BoxCollider2D」というコンポーネントを追加します。
「Area Exit」というゲームオブジェクトに出口用スクリプト「AreaExit」をアタッチします。
出口用スクリプトの「AreaToLoad」に切り替え先のシーン名を入力します。
出口用スクリプトの「AreaTransitionName」に「遷移名」を入力します。
「AreaTransitionName」はシーン間を結びつけるものです。
例として洞窟と洞窟前の出口の設定を載せてみました。
- 洞窟
- 洞窟前
入口のGameObject
「Area Entrance」というゲームオブジェクトを作成します。
「Area Entrance」というゲームオブジェクトの「Transform」コンポーネント「Position」から位置を指定します。
「Area Entrance」というゲームオブジェクトに入口用スクリプト「AreaEntrance」をアタッチします。