[Unity 2D] Portal 같은 게임 만들기 #7 레벨 1 디자인, Scene Controller
이펙트, 효과음 등 추가해야 할 사항들이 많지만 우선 사용자가 플레이할 첫 번째 레벨부터 구현해보도록 하겠습니다!
우선 다음과 같이 레벨을 디자인 해보았습니다.
간략하게 설명하자면, 우선 플레이어의 동선을 블루 포탈 -> 오렌지 포탈 -> 전원 버튼 -> 오렌지 포탈 -> 블루 포탈 -> 나가는 문으로 설정했습니다.
위 과정을 통해 플레이어는
- 블루 포탈, 오렌지 포탈
- 전원 버튼
- 클리어를 위한 나가는 문
의 용도를 알게 됩니다!
우선 나가는 문으로 도달한 경우 다음 레벨을 로딩하는 스크립트(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로 바꾸고 게임 오브젝트를 다시 만드는 코드를 작성했습니다.
다음은 캐릭터에 애니메이션을 추가해보겠습니다!