ものづくりのブログ

うちのネコを題材にしたものづくりができたらいいなと思っていろいろ奮闘してます。

Unityで2DのRPGを作る - フィールド間を移動させる方法

2DRPGを作っていたら、町から家の中や1階から2階などに切り替える方法がわからないことに気が付きました。
しかも、ただ切り替えるだけではなく、町の中のある家の扉付近から、その家の中の扉の前と位置を指定してシーンを切り替える必要が出てきました。
今回は、その際に実装した方法についてメモを残しておこうと思います。

やりたいこと

  • フィールド間を移動させたい

準備するもの

操作できるキャラクタの設定

キャラクターの設定は以下のものを使用します。
a1026302.hatenablog.com

切り替え用のSceneを2つ

シーンを切り替えたいので、事前に2つSceneを準備して、「Scenes In Build」にシーンを登録しておきます。
「Scenes In Build」の登録は、メニューの「File」->「Build Settings」をクリックすると「Build Settings」というサブウィンドウが表示されるので、そこから登録します。
f:id:a1026302:20201202133500j:plain
Projectから使用するシーンをドラック&ドロップすることを登録することができます。
f:id:a1026302:20201202133357j:plain

設定

出口と入口を作成します。

スクリプト準備

出口のスクリプト作成

出口のスクリプトを作成します。
このスクリプトは、切り替え先のシーン名と遷移名を指定することで、切り替え先のシーンの入り口に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」はシーン間を結びつけるものです。

例として洞窟と洞窟前の出口の設定を載せてみました。

  • 洞窟

f:id:a1026302:20200925175252j:plain

  • 洞窟前

f:id:a1026302:20200925180127j:plain

入口のGameObject

「Area Entrance」というゲームオブジェクトを作成します。
「Area Entrance」というゲームオブジェクトの「Transform」コンポーネント「Position」から位置を指定します。
「Area Entrance」というゲームオブジェクトに入口用スクリプト「AreaEntrance」をアタッチします。