9.1 씬에서 씬으로 이동하기

레벨의 출입구와 연동해서 레벨을 이동하도록 합니다.   RoomManager라는 폴더를 만들어 관련 리소스를 저장합니다.

 

출입구 게임 오브젝트와 스크립트 만들기

플레이어가 접촉하면 씬을 이동하기 위한 게임 오브젝트와 스크립트를 만듭니다.

WorldMap 씬을 로딩합니다.

플레이어 프리팹을 배치합니다.

계층 뷰의 + > Create Empty를 클릭하고 이름을 Exit로 하고 알기쉽게 칼라아이콘을 붙입니다. Exit라는 Tag도 만들어 적용합니다.

CircleCollider2D 컴포넌트를 추가하고 타일에 맞게 크기를 조금 작게 합니다. 크기는 EditCollider를 클릭후 원위의 점을 끌면 됩니다.  IsTrigger를 체크합니다. 출입구 타일 위에 배치합니다. 칼라아이콘을 적용해 아이콘위에 이름이 보여 쉽게 식별이 가능합니다.

RoomManager폴더에 다음과 같이 Exit 스크립트를 만들어 저장합니다.

Exit.cs
0.00MB

enum ExitDirection

ExitDirection라는 enum Type 에 4개의 방향을 정의했습니다. 방향을 0,1,2,3같은 숫자로 사용하는 것보다 직관적입니다.

//출입구 위치
public enum ExitDirection
{
    right,  //오른쪽
    left,   //왼쪽
    down,   //아래쪽
    up,     //위쪽
}

변수

이동할 씬, 씬의 문번호, 캐릭터가 바라볼 방향을 뜻합니다.

public string sceneName = "";   //이동할 씬 이름
public int doorNumber = 0;      //캐릭터가 위치할 문 번호
public ExitDirection direction = ExitDirection.down;//문에서 나온 캐릭터가 바라보는 방향

OnTriggerEnter2D()

충돌이 일어나고 Tag가 Player라면 정해진 씬과 doorNumber를 전달하고 ChangeScene()을 호출한다.

private void OnTriggerEnter2D(Collider2D collision)
{
    if (collision.gameObject.tag == "Player")
    {
        RoomManager.ChangeScene(sceneName, doorNumber);
    }
}

 

방을 관리하는 게임 오브젝트 만들기

방을 관리하는 게임오브젝트와 클래스를 만듭니다. 빈오브젝트를 씬에 배치하고 이름을 RoomManager로 합니다.

RoomManager 스크립트를 RoomManager 폴더에 만들고 씬뷰의 RoomManager오브젝트에 어태치합니다.

RoomManager.cs
0.00MB

선언

씬을 처리하기 위해 선언합니다.

using UnityEngine.SceneManagement;

변수

doorNumber를 static으로 선업합니다. 그래야 씬이 바뀌어도 유지됩니다.

// static 변수
public static int doorNumber = 0;   //문 번

Start()

Exit 라는 Tag를 전부찾아 enters라는 배열에 저장한다

c#에서는 Type[] name; 으로 배열을 선언한다.

배열에서 GameObject를 꺼내 Exit 컴포넌트의 doorNumber와 static doorNumber를 비교해서 찾은 door의 위치에 플레이어를 배치하고 도어의 뚫린 방향으로 이동시켜준다. 그래야 조금 나와 있는것 처럼 보이니까.

void Start() {
    //플레이어 캐릭터 위치
    //출입구를 배열로 얻기
    GameObject[] enters = GameObject.FindGameObjectsWithTag("Exit");
    for (int i = 0; i < enters.Length; i++)  {
        GameObject doorObj = enters[i]; //배열에서 꺼내기
        Exit exit = doorObj.GetComponent<Exit>();   //Exit 클래스 변수
        if (doorNumber == exit.doorNumber)  {
            //==== 같은 문  번호 ====
            //플레이어 캐릭터를 출입구로 이동
            float x = doorObj.transform.position.x;
            float y = doorObj.transform.position.y;
            if (exit.direction == ExitDirection.up)  {
                y += 1;
            }  else if (exit.direction == ExitDirection.right)  {
                x += 1;
            } else if (exit.direction == ExitDirection.down) {
                y -= 1;
            }  else if (exit.direction == ExitDirection.left) {
                x -= 1;
            }
            GameObject player = GameObject.FindGameObjectWithTag("Player");
            player.transform.position = new Vector3(x, y);
            break;  //반복문 빠나오기
        }
    }
}

public static void ChangeScene()

doornum을 doorNumber에 저장하고 scenename의 씬을 호출합니다. 

ChangeScene()은  외부에서 static doorNumber를 변경시키므로 public static 으로 선언됩니다.

public static void ChangeScene(string scnename, int doornum)
{
    doorNumber = doornum;   //문 번호를 static 변수에 저장

    //string nowScene = PlayerPrefs.GetString("LastScene");
    //if (nowScene != "")
    //{
    //    SaveDataManager.saveArrangeData(nowScene);      //配置データを保存
    //}
    //PlayerPrefs.SetString("LastScene", scnename);   //シーン名を保存
    //PlayerPrefs.SetInt("LastDoor", doornum);        //ドア番号保存
    //ItemKeeper.SaveItem();                          //アイテムを保存

    SceneManager.LoadScene(scnename);   //シーン移動
}

여기까지 완료한 RoomManager와 Exit를 RoomManager폴더로 끌어 프리팹으로 만듭니다. (예제폴더를 사용하시면 이미 만들어져 있습니다.)

 

출입구 배치하기

레벨의 출입구에 Exit프리팹을 배치하고 스크립트에 SceneName을 적고 Door Number를 순서대로 0,1,2... 으로 적습니다. direction은 플레이어가 나갈 방향을 정합니다.

 

문 만들기

출입구를 막는 문을 만듭니다. 열쇠가 있다면 열립니다. 문은 나중에 만들 Item과 비스하므로 Item폴더를 만들고 저장합니다.

Item.zip
0.02MB

문 이미지는 Door입니다. Door 이미지도 Item폴더로 옮깁니다. 32x32픽셀의 도트 이미지이므로 Pixel Per Unit를 32로 하고 Filter Mode를 Point로 합니다.

이미지 설정후 Door를 씬뷰로 끌어다 놓고 BoxCollider2D와 Order In Layer 1로 하고 Door Tag를 만들어 적용합니다.

열쇠를 가지고 있으면 열수 있도록 스크립트를 만들어 봅니다.

Door 스크립트를 Item폴더에 저장하고 Door오브젝트에 어태치합니다.

Door.cs
0.00MB

변수

public int arrangeId = 0;       //식별에 사용하기 위한 값

OnCollisionEnter2D(Collision2D collision)

"Player"와 충돌이 있으면 열쇠를 하나 감소 시키고 문을 열어 줍니다.

void OnCollisionEnter2D(Collision2D collision)
{
    if (collision.gameObject.tag == "Player")
    {
        //열쇠를 가지고있으면
        if (ItemKeeper.hasKeys > 0)
        {
            ItemKeeper.hasKeys--;       //열쇠를 하나 감소
            Destroy(this.gameObject);   //문 열기
        }
    }
}

 

Door를 배치합니다.

Door를 배치하면 키가 없으면 들어갈수 없습니다. 테스트로 ItemKeeper 스크립트의 변수를 바꿔주면

public static int hasKeys = 1;          //열쇠 수
public static int hasArrows = 10;        //화살 소지수

처음 한번은 통과하지만 dungeon1으로 갔다 다시 와서 들어가려고 하면 키가 없어 못들어가는걸 확인할 수 있습니다.

 

dungeon1씬에도 Exit배치

dungeon1 씬에도  Exit를 배치하고 스크립트에 WorldMap과 방향을 down으로 하면 dungeon1에서 WorldMap으로도 이동할 수 있습니다.

+ Recent posts