본문 바로가기
유니티로 게임만들기

유니티로 2D 게임 만들어 보기 (맵이동 #5)

by SajuPlanet 2024. 8. 1.

자 이제 맵이동을 만들어볼것이다 보통 씬(Scene)이동이라고 표현하는것 같다. 

챗지피티에 물어본다. 

유니티에서 씬이동을 하려면 어떻게 해야돼?

 

유니티에서 특정 위치에 캐릭터가 접근하면 씬 이동 여부를 묻는 UI(예: 체크박스 또는 버튼)가 나타나도록 하고, 사용자가 선택한 답변에 따라 씬 이동을 결정하는 기능을 구현할 수 있습니다. 이를 위해 다음과 같은 단계를 따릅니다.

1. 트리거 설정

먼저, 특정 위치에 트리거 Collider를 설정합니다. 캐릭터가 이 트리거에 접근할 때 이벤트를 발생시킬 수 있습니다.

  1. 트리거 오브젝트 생성: 새 게임 오브젝트를 생성하고 Collider 2D(예: BoxCollider2D)를 추가합니다.
  2. 트리거 설정: Is Trigger 옵션을 체크하여 트리거로 설정합니다.
  3. 스크립트 추가: 트리거에 이벤트를 추가하기 위해 스크립트를 작성합니다.

2. UI 구성

씬 이동 여부를 묻기 위해 UI를 설정합니다.

  1. UI Canvas 생성: UI > Canvas를 추가합니다.
  2. UI 패널 생성: Canvas 하위에 UI > Panel을 추가하고, UI 패널의 크기와 위치를 설정합니다. 이 패널에 버튼과 텍스트를 배치할 수 있습니다.
  3. UI 버튼 추가: 패널 아래에 UI > Button을 추가하여 예/아니오 버튼을 만듭니다. 버튼의 텍스트와 위치를 조정합니다.
  4. UI 비활성화: 기본적으로 UI 패널을 비활성화하여 게임 시작 시 보이지 않도록 합니다.

3. 스크립트 작성

트리거 이벤트를 통해 UI를 활성화하고, 버튼 클릭 시 씬 이동을 처리하는 스크립트를 작성합니다.

 
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;

public class SceneTransitionTrigger : MonoBehaviour
{
    public GameObject uiPanel;  // UI 패널 오브젝트
    public Button yesButton;
    public Button noButton;
    public string targetScene;  // 이동할 씬 이름

    void Start()
    {
        uiPanel.SetActive(false);  // 처음엔 UI 패널을 숨김

        yesButton.onClick.AddListener(OnYesButtonClicked);
        noButton.onClick.AddListener(OnNoButtonClicked);
    }

    void OnTriggerEnter2D(Collider2D other)
    {
        if (other.CompareTag("Player"))
        {
            uiPanel.SetActive(true);  // 플레이어가 트리거에 들어오면 UI 패널을 보임
        }
    }

    void OnTriggerExit2D(Collider2D other)
    {
        if (other.CompareTag("Player"))
        {
            uiPanel.SetActive(false);  // 플레이어가 트리거에서 벗어나면 UI 패널을 숨김
        }
    }

    void OnYesButtonClicked()
    {
        SceneManager.LoadScene(targetScene);  // 예 버튼 클릭 시 씬 이동
    }

    void OnNoButtonClicked()
    {
        uiPanel.SetActive(false);  // 아니오 버튼 클릭 시 UI 패널을 숨김
    }
}
 

4. 설정 및 연결

  1. 트리거 오브젝트 설정: 위 스크립트를 트리거 오브젝트에 추가하고, uiPanel, yesButton, noButton, targetScene 필드를 인스펙터에서 설정합니다.
  2. UI 오브젝트 연결: UI 패널 오브젝트와 예/아니오 버튼을 각각 인스펙터의 해당 필드에 드래그 앤 드롭으로 연결합니다.
  3. 타겟 씬 설정: targetScene 필드에 이동할 씬의 이름을 입력합니다.

이렇게 설정하면 캐릭터가 트리거에 들어오면 씬 이동 여부를 묻는 UI가 나타나고, 플레이어가 "예"를 선택하면 씬이 이동됩니다. "아니오"를 선택하면 UI가 닫히고 씬 이동이 취소됩니다.

 

챗지피티가 대답한것들을 하나하나 해보자 우선 씬을 하나 만들것이다 카오스닉던전 아래 입구처럼 보이는곳으로 이동하면 카오스닉던전에 입장하시겠습니까 예/아니오 버튼이 생성되고 예를 선택하면 맵을 이동 아니오를 선택하면 초기화면으로 돌아가게 만들고 싶다. 콜라이더 만드는건 간단하고 그 콜라이더에 스크립트를 추가하는것도 간단하다. 

캔버스에 예/아니오 버튼을 만들어보려고 한다.

 

챗지피티가 하라는대로 캔버스를 만들고 그아래 uiPanel을 만들고 그아래 버튼을 만들고 버튼아래에 텍스트를 만들었다.

한글로 하려니 오류가 났다 나중에 한글을 사용할 수 있게 하는 방법을 찾아봐야겠다. 우선 영어로 선택창을 만들었다. 

선택창은 위에 상태바를 만들어서 옮기게도 할 수 있지만 우선은 예스 노 버튼으로 던전에 들어갈것이냐 말것이냐로 만들기로 했다. 예스를 누르면 던전으로 이동하고 씬이 이동되고 아니오(no) 버튼을  클릭하면 아무일도 일어나지 않을것이다.

카오스닉던전 입구쪽에 콜라이더를 생성해서 그곳에 캐릭터가 이동하게되면 ui가 가운데에 노출되게 했다. 

이 순서대로 하면 선택창을 쉽게 만들수 있었고 창의 크기를 조절하는게 조금 난해하긴 했지만 

보시다시피 크기가 이게 맞나 싶을정도로 어색했다. 좌측아래 조그만한 점이 맵크기다. 암튼 실행하면 아래 크기로 나온다. 

 

 

그리고 씬을 만들어줘야 하는데  에셋 아래 씬에 Hell 이라는 이름으로 씬을 만들었다. 그리고 씬을 만들면 꼭 해줘야하는게 있다. 

 

파일 > 빌드 세팅에 들어가서 > 

 

드래그 앤 드롭으로 씬을 추가해줘야 씬을 활용할 수 있게 된다. 

 

 

그리고 이벤트 콜라이더에 챗지피티가준 코드를 추가한다. 콜라이더는 그냥 하이라키에 우클릭 2d오브젝트 스프라이트 스퀘어로 대충만들었다. 

그리고 캔버스 아래있는애들을 스크립트 추가한 오른쪽에 드래그앤드롭해서 1대1매칭을 해줬다. 타겟 씬은 수동으로 넣어줬다.

그리고 제일 중요한 부분인데 

 

플레이어 인스펙터에 Tag 태그에 player로 꼭 변경해야 트리거가 작동한다. 이거를 몰라서 30분간 헤맸다

 

 

 

yes를 클릭하면 카오스닉 던전으로 이동한다. 내가 물을 무서워하기 때문에 파란색 배경이면 내겐 지옥이나 다름없다. 

아 그리고 씬을 이동하면 씬에 있던 모든 오브젝트는 사라진다. 그렇기 때문에 오브젝트를 하나의 상자로 만들어서 다른 씬에도 쉽게 넣을 수 있는 방법이 있다 바로 프리펩이다. Prefabs 이라고 하는데 

 

프리팹으로 만들어 씬에 넣으면 저렇게 파란색 상자가 된다. 

프리팹화 하면 저 아래 all Prefabs에서 손쉽게 새로운씬에 넣을 수 있다. 

 

그리고 새로운씬으로 이동될 때 저 위치에서 시작되는데 새로운씬에 캐릭터를 수동으로 저곳에 위치 시켰더니 저곳에서 시작됐다. 이동씬 및 아이템구매 대화 등등의 씬은 초기값이 그렇게 중요하진 않으니 넘어가고 

 

나중에 전투씬을 구현할때는 초기값이 중요해질수도 있으니 그때 이 부분 자세히 알아보면 좋을것 같다. 

6.맵이동선택창.mp4
3.09MB

이상.

반응형

댓글