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

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

by SajuPlanet 2024. 8. 1.

자 마을에서 던전으로 입장했다. 그럼 던전에서 나오는 방법은 3가지가 있다. 1번 적에게 죽었을경우 던전 밖으로 튕겨저 나온다. 이 경우 얻는것은 없다.  2번 왕을 토벌하면 경험치 및 금전보상을 100% 받을 수 있다. 3번 게임을 포기한다.

우선 3번 게임을 포기한다에 대한 메시지를 띄워서 예를 클릭하면 다시 마을로 이동하고 아니오를 클릭하면 창이 닫히는기능을 만들고자 한다. 

 

유니티에서 Hell 씬에서 Esc 키를 누르면 "게임을 그만두시겠습니까?"라는 메시지 창이 나오고, "예"를 선택하면 Place1 씬으로 돌아가는 기능을 구현하는 방법을 설명하겠습니다. 이를 위해 유니티의 UI 시스템을 사용하여 메시지 창을 표시하고, 버튼 클릭 이벤트를 처리하여 씬을 전환할 수 있습니다.

다음은 그 구현을 위한 코드 예제와 설명입니다:

1. 유니티 에디터에서 준비하기

  1. 캔버스 생성: Hell 씬에 캔버스를 추가합니다.
  2. 패널 추가: 메시지 창으로 사용할 패널을 캔버스에 추가합니다. 이 패널은 기본적으로 비활성화해둡니다.
  3. 텍스트 추가: 패널에 텍스트를 추가하여 "게임을 그만두시겠습니까?" 메시지를 표시합니다.
  4. 버튼 추가: 패널에 "예"와 "아니오" 버튼을 추가합니다.
  5. 스크립트 추가: 아래의 스크립트를 작성하고, 캔버스나 다른 적절한 게임 오브젝트에 추가합니다.

익숙한 캔버스가 여기서도 나온다. 이제 캔버스 패널추가 버튼추가 텍스트 추가는 너무 익숙해졌다. 

그리고 스크립트도 당연히 챗지피티에 물어본다. 

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

public class ExitPrompt : MonoBehaviour
{
    public GameObject messagePanel; // 메시지 창 패널
    public Button yesButton; // "예" 버튼
    public Button noButton; // "아니오" 버튼

    void Start()
    {
        // 메시지 창 비활성화
        messagePanel.SetActive(false);

        // 버튼 클릭 이벤트 설정
        yesButton.onClick.AddListener(OnYesButtonClicked);
        noButton.onClick.AddListener(OnNoButtonClicked);
    }

    void Update()
    {
        // Hell 씬에서 Esc 키를 눌렀을 때 메시지 창 표시
        if (Input.GetKeyDown(KeyCode.Escape))
        {
            messagePanel.SetActive(true); // 메시지 창 활성화
            Time.timeScale = 0; // 게임 일시 정지
        }
    }

    void OnYesButtonClicked()
    {
        // "예" 버튼을 클릭하면 Place1 씬으로 이동
        Time.timeScale = 1; // 게임 재개
        SceneManager.LoadScene("Place1");
    }

    void OnNoButtonClicked()
    {
        // "아니오" 버튼을 클릭하면 메시지 창 닫기
        messagePanel.SetActive(false);
        Time.timeScale = 1; // 게임 재개
    }
}

이 코드는 캔버스에 설치한다. 

 

이제 어떻게 해야하는지 감이 슬슬 오고 있다. 

자 게임을 시작하고 카오스닉 던전으로 들어가서 키보드로 ESC를 누르면 창이 나와야한다. 

결과는 아무리 키보드를 눌러도 창이 나타나지 않는다. 1시간 정도 왜 그런지 챗지피티에 물어도 방법을 찾아주지를 않는다 그런데 이런 대답을 내놓았다. 

5. 유니티 입력 시스템 확인

유니티 프로젝트가 Input System 패키지를 사용하는 경우, Input.GetKeyDown(KeyCode.Escape) 방식 대신 Input System을 사용하여 키보드 입력을 처리해야 할 수 있습니다. 현재 사용하는 입력 시스템이 무엇인지 확인하세요.

뭐라고? 방식이 2가지 방식이 있는거야? 구글링을 해보니까 뭔가 시스템이 업데이트된 모양이다. 

 

https://mgtul.tistory.com/37 님의 블로그 내용입니다. 감사합니다.

오호 저기서 저걸 BOTH로 하면 된다 이거지 오키오키

 

그랬는데도 해결이 되지 않았다. 

방법은 유니티에서 Input System 패키지를 다운받아 인스톨한 후 프로그램을 재시작 하면 된다는것이다.아래는 방법이다. 

Input System 패키지가 Unity Package Manager에서 발견되지 않는 경우, 다음 단계를 통해 Input System 패키지를 설치하고 설정할 수 있습니다.

1. Input System 패키지 설치

  1. Unity Package Manager 열기:
    • Unity Editor에서 Window > Package Manager를 선택합니다.
  2. Unity Registry에서 패키지 검색:
    • Package Manager 창에서 좌측 상단의 Packages 드롭다운 메뉴를 클릭하고, Unity Registry를 선택합니다. 이는 Unity의 모든 공식 패키지를 나열합니다.
  3. Input System 검색:
    • 검색창에 Input System을 입력하여 패키지를 찾습니다.
  4. 패키지 설치:
    • Input System 패키지를 선택하고, 오른쪽 하단의 Install 버튼을 클릭하여 패키지를 설치합니다.

2. Input System 패키지 활성화

패키지를 설치한 후, 새로운 Input System을 프로젝트에 활성화하려면 다음 단계를 수행합니다:

  1. Project Settings 열기:
    • Unity Editor에서 Edit > Project Settings를 선택합니다.
  2. Player 설정으로 이동:
    • 왼쪽 사이드바에서 Player를 선택합니다.
  3. Active Input Handling 설정:
    • Other Settings 섹션으로 이동합니다.
    • Active Input Handling 옵션을 찾아, 드롭다운 메뉴에서 **Input System Package (New)**를 선택합니다.
    • Both를 선택하면, 기존 입력 시스템과 새로운 입력 시스템이 함께 사용됩니다.
  4. Unity 재시작:
    • 설정 변경 후 Unity를 재시작하는 것이 좋습니다. 이를 통해 새로운 입력 시스템이 제대로 적용됩니다.

 

이 과정을 모두 한 다음 게임을 실행하고 ESC를 누르니 창이 뜨고 잘 작동했다. 

 

 

자 이게 끝이 아니다. 씬1에서 씬2로 이동하면 씬1에 있던 캐릭터는 계속 씬1에 남게되고 씬2로 이동하게 된다. 그럼 씬2에 서 씬1로 이동하게 되면 씬2에 캐릭터가 있고 다시 씬1로 이동하게 된다. 여기서 문제가 발생하는데 씬1에 원래 캐릭터가 있으니 씬2에서 씬1로 이동하게 되면 씬1에는 캐릭터가 2개가 생기게 된다. 씬이동을 반복하면 캐릭터가 계속 복제되는 일이 발생한다. 그렇기 때문에 이 문제를 해결해야 한다. 이 문제도 챗지피티에게 물어본다. 

2D 콜라이더에서 오류가 생겼어 오류 내용은 MissingRefreneceException: The dbject of type 'GameObject' has been destroyed but you are still trying to access it your script should either check if it is null or you should not destroy the object.
 
ChatGPT

MissingReferenceException 오류는 Unity에서 자주 발생하는 문제로, 주로 삭제되거나 비활성화된 객체에 접근하려고 할 때 발생합니다. 이 오류는 다음과 같은 상황에서 나타날 수 있습니다:

  1. 게임 오브젝트가 삭제된 경우: 객체가 삭제되었는데 코드에서 여전히 그 객체에 접근하려고 할 때.
  2. 비활성화된 게임 오브젝트: 게임 오브젝트가 비활성화되어 있지만, 여전히 참조를 유지하고 있을 때.
  3. 참조가 유효하지 않을 때: 스크립트가 참조하고 있는 게임 오브젝트가 다른 이유로 인해 유효하지 않을 때.

 

using UnityEngine;

public class StaticInstance : MonoBehaviour
{
    public GameObject targetObject; // 검사할 게임 오브젝트

    void OnTriggerEnter2D(Collider2D other)
    {
        if (other != null && other.gameObject != null)
        {
            Debug.Log("Collided with: " + other.gameObject.name);
            // 필요한 처리를 수행
        }
        else
        {
            Debug.LogWarning("The collider or its game object is missing or destroyed.");
        }
    }

    void SomeMethod()
    {
        if (targetObject != null)
        {
            Destroy(targetObject); // 게임 오브젝트 삭제
            targetObject = null; // 참조를 null로 설정
        }
    }
}

 

이 코드를 씬 독립 오프젝트에 설치해서 

 

타겟 오브젝트를 캐릭터로 설정하면 이동된 캐릭터는 삭제하게 된다. 

 

7.씬이동왕복.mp4
11.05MB

 

이상!

반응형

댓글