Coding Feature.

[Unity 2D] Portal 같은 게임 만들기 #7 레벨 1 디자인, Scene Controller 본문

Toy Project/mini-portal [Unity2D]

[Unity 2D] Portal 같은 게임 만들기 #7 레벨 1 디자인, Scene Controller

codingfeature 2024. 1. 9. 13:48

이펙트, 효과음 등 추가해야 할 사항들이 많지만 우선 사용자가 플레이할 첫 번째 레벨부터 구현해보도록 하겠습니다!

 

우선 다음과 같이 레벨을 디자인 해보았습니다.

 

 

간략하게 설명하자면, 우선 플레이어의 동선을 블루 포탈 -> 오렌지 포탈 -> 전원 버튼 -> 오렌지 포탈 -> 블루 포탈 -> 나가는 문으로 설정했습니다.

 

위 과정을 통해 플레이어는

- 블루 포탈, 오렌지 포탈

- 전원 버튼

- 클리어를 위한 나가는 문

의 용도를 알게 됩니다!

 

우선 나가는 문으로 도달한 경우 다음 레벨을 로딩하는 스크립트(SceneController.cs)를 짜보았습니다.

using UnityEngine;
using UnityEngine.SceneManagement;

public class SceneController : MonoBehaviour
{
    public static SceneController instance;

    private void Awake()
    {
        if(instance == null) 
        {
            instance = this;
            DontDestroyOnLoad(gameObject);
        }
        else
        {
            Destroy(gameObject);
        }
    }
    public void LoadNextLevel()
    {
        SceneManager.LoadSceneAsync(SceneManager.GetActiveScene().buildIndex + 1); // 빌드 index 상 다음 scene 로드.
    }

    public void LoadScene(string sceneName)
    {
        SceneManager.LoadSceneAsync(sceneName);
    }
}

 

LoadNextLevel 함수는 빌드 세팅 상 다음 index의 scene을 로드할 수 있도록 해줍니다.

이 함수를 위해서는 빌드 세팅에 들어가 여러 Scene들을 꼭 추가해줘야 합니다.

 

 

그리고 LoadScene은 string 으로 scene 이름을 받아서 로드할 수 있도록 해줍니다.

 

 사실 유니티에서 Scene 관리는 처음이라 코드를 아래 영상 고대로 사용했네요.. ㅎㅎ

궁금하시면 참고바랍니다!

 

https://www.youtube.com/watch?v=E25JWfeCFPA&list=LL&index=5&t=160s

 

 

그리고 나가는 문 Game Object에 ObjectScript.cs를 작성해줬습니다.

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ObjectScript : MonoBehaviour
{
    private void OnTriggerEnter2D(Collider2D collision)
    {
        if (collision.CompareTag("Player"))
        {
            SceneController.instance.LoadNextLevel();
        }
    }
}

 

이전에 SceneController 클래스에서 static으로 선언한 instance 객체를 참조하여 LoadNextLevel() 함수를 호출합니다.

물론 나가는 문 Game Object에 Collision 트리거를 설정해줘야겠죠 :)

 

 

 

그 다음 전원 버튼을 사용해 나가는 문 앞에 놓인 장애물 Blocked 게임 오브젝트를 없애는 스크립트를 작성해보았습니다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class OnOffButtonScript : MonoBehaviour
{
    public SpriteRenderer spriteRenderer;

    public Sprite OnSprite;
    public Sprite OffSprite;
    public GameObject Blocked;

    bool m_isOn;

    private void Start()
    {
        m_isOn = true;
    }
    private void OnTriggerEnter2D(Collider2D collision)
    {
        if (collision.CompareTag("Player"))
        {
            if (m_isOn) // 켜져 있는 경우, 
            {
                spriteRenderer.sprite = OffSprite;
                Blocked.SetActive(false);
                m_isOn = false;
            }
            else { // 꺼져 있는 경우,
                spriteRenderer.sprite = OnSprite;
                Blocked.SetActive(true);
                m_isOn = true;
            }
        }
    }
}

 

m_isOn 변수를 통해 버튼이 On인 경우 플레이어가 닿으면 Off sprite로 바꾸고 Blocked 게임 오브젝트를 없애고 반대는 On Sprite로 바꾸고 게임 오브젝트를 다시 만드는 코드를 작성했습니다.

 

 

다음은 캐릭터에 애니메이션을 추가해보겠습니다!