유니티 버튼 씬전환 - yuniti beoteun ssinjeonhwan

Visual Studio(혹은 다른 IDE) 창이 뜨면 [1] GameStart.cs 스크립트(혹은 여러분이 새로 만든 스크립트)를 클릭한다. [2] using UnityEngine.SceneManagement; 를 작성하고 StartGame 함수에 기존 내용 삭제 후 [3] SceneManager.LoadScene("SampleScene"); 을 작성하고 [4] Ctrl + S 를 입력하여 파일을 저장한다. SceneManager의 LoadScene 기능을 통해 특정 Scene을 불러와 전화하는 것이다. 만약 여러분이 새로 만든 스크립트를 사용한다면 StartGame 함수는 위의 그림과 같이 작성하면 된다.

다시 [5] 유니티 화면으로 전환하기 위해 Visual Studio 창을 끄거나, 최소화한다.

저번에 씬을 변경하거나 불러오는 방법을 알아봤는데 이번에는 버튼(UI)을 만들어서 그 버튼으로 제어하는 방법을 알아볼거에요. 게임을 제작할때 어떻게 설계하냐에 따라서 클릭해서 장면이동하거나, 버튼을 이용하거나 여러가지 방법이 있을수 여러가지를 경험해 보는것도 도움이 많이 될거에요. 

 

UI 버튼을 이용하여 장면(씬Scene)이동 하기

 

먼저 저번시간에 썼던 화면을 그대로 이용할거에요. 저번 강좌를 안보셨으면,,,

 

Scene을 두개를 만들어 주세요. MainScene, SubScene으로 전 구분을 해줬어요. 

MainScene과 SubScene을 단순히 눈으로 구분해주기 위해서 메인씬에는 큐브를 서브씬에는 원을 만들어 주고

서브씬에는 UI 버튼을 추가해 줬어요. 

 

저번강좌를 참고하고 싶으면 아래 링크를 클릭해서 한번 훅~ 보시면 되요. 

 

2020/11/24 - [유니티강좌] 씬(Scene) 변경, 불러오기 #1

 

이제 시작할께요. ^^

 

먼저 스크립트를 작성을 해주세요. 

스크립트 이름은 ChangeSceneToSub.cs라고 해줬어요. 이건 원하시는데로 하시고 나중에 찾기만 잘 찾으면 되요. 

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;

public class ChangeSceneToSub : MonoBehaviour
{
    public void OnRetry()
    {
        SceneManager.LoadScene("MainScene");
    }
}

 

위에서부터 필요한 부분을 보면 UI 시스템을 이용할때 필요한 라이브러리에요. 이거 없으면 안되니 ^^ 꼭 해주세요. 

 

using UnityEngine.UI;

 

또 한가지 씬 처리를 하기 위한 라이브러리에요. ^^ 없으면 안되요. 

 

using UnityEngine.SceneManagement;

 

OnRetry()함수를 선언했어요.  씬을 불러들이는 두가지 방법이 있어요. 하나는 지정한 씬을 부르는거 하나는 자기자신을 부르는거에요.  OnRetry함수가 실행되면 Scene을 로드 할수 있도록 하고 있어요. 

 

    // OnRetry 함수가 실행되면 Scene을 읽어들임
    public void OnRetry()
    {
        // MainScene을 불러들임
        SceneManager.LoadScene("MainScene");

        // 현재의 Scene을 불러들임
        SceneManager.LoadScene(SceneManager.GetActiveScene().name);
    }

 

SceneManager.LoadScene("MainScene");

지정한씬(MainScene)을 로드

SceneManager.LoadScene(SceneManager.GetActiveScene().name);

 현재 Scene을 로드

 

스크립트를 저장하고 나오셔서 버튼을 눌렀을때의 이벤트를 설정할거에요. 

버튼을 선택하신후 Inspector에서 OnClick() → + 버튼을 클릭해서 추가를 해주세요. 

 

유니티 버튼 씬전환 - yuniti beoteun ssinjeonhwan

 

추가를 하면 아래와 같은 화면이 나오는데 None이라고 보이는 부분에는 Canvas를 드래그 해서 선택해주면 오른쪽의 No Function 부분에 이번에 작성한 스크립트의 OnRetry()함수를 지정해 줄거에요. 

Scene뷰의 좌측 상단의 2D를 눌러준 후 스크롤과 트랜스폼 이동으로 위와 같이 버튼도 배치를 해줍니다. 이렇게 생성된 UI는 3D공간의 변화와 무관하게 유리창처럼 씬의 앞에 띄워져있습니다.

유니티 버튼 씬전환 - yuniti beoteun ssinjeonhwan

버튼 객체의 하위 Text에서 버튼의 내용물을 설정할 수 있습니다. 'Stage2로 이동' 이라고 설정해주겠습니다.

유니티 버튼 씬전환 - yuniti beoteun ssinjeonhwan

게임을 실행해보면 메인 카메라를 통해보는 3D공간과 UI 객체가 존재하는 2D 공간이 한꺼번에 보여집니다.

유니티 버튼 씬전환 - yuniti beoteun ssinjeonhwan

이러한 씬들의 전환을 위해서는 File ☞ Build & Settings...에 씬을 등록해줘야합니다.

유니티 버튼 씬전환 - yuniti beoteun ssinjeonhwan

Add Open Scene를 눌러줍니다.

유니티 버튼 씬전환 - yuniti beoteun ssinjeonhwan

씬이 저장되어있지 않다면 저장해주고 등록을 완료했으면 창을 닫아줍니다.

유니티 버튼 씬전환 - yuniti beoteun ssinjeonhwan

현재 씬을 다른 이름으로 복사하여 2번 째 씬을 만들어보도록 하겠습니다.

유니티 버튼 씬전환 - yuniti beoteun ssinjeonhwan

첫 씬과 완전히 같은 두 번째 씬이 생성되었습니다.

유니티 버튼 씬전환 - yuniti beoteun ssinjeonhwan

3D Text의 내용을 'Stage 2'로 설정해줍니다.

유니티 버튼 씬전환 - yuniti beoteun ssinjeonhwan

Button 의 내용물을 'Stage 1로 이동'으로 설정해줍니다.

유니티 버튼 씬전환 - yuniti beoteun ssinjeonhwan

위와 같이 Plane 오브젝트도 색상을 달리하여 구분이 쉽도록 해줍니다.

유니티 버튼 씬전환 - yuniti beoteun ssinjeonhwan

이 씬도 아까와 같은 방법으로 등록해줍니다.

 유니티 5.3이 되면서 이전의 방법과 다르게 SceneManger.LoadScene(string 호출할 씬명);을 사용합니다. 여기서 주의해야할 점은 using UnityEngine.SceneManagement;를 상단에 선언해줘야합니다. 생성된 두 함수는 아직 실행되지 않았기 때문에 아무 일도 일어나지 않습니다.

유니티 버튼 씬전환 - yuniti beoteun ssinjeonhwan

생성한 스크립트를 메인카메라에 붙여줍니다.


유니티 버튼 씬전환 - yuniti beoteun ssinjeonhwan

UI 버튼을 클릭했을 때 씬을 전환하기 위해 버튼 객체의 On Click()의 +를 눌러주고 None 부분을 클릭합니다.

유니티 버튼 씬전환 - yuniti beoteun ssinjeonhwan

버튼을 클릭했을 때 위에 생성한 스크립트 내의 함수를 실행해야하기 때문에 스크립트가 붙어있는 메인카메라를 선택합니다.

유니티 버튼 씬전환 - yuniti beoteun ssinjeonhwan

스크립트 컴포넌트 내의 SceneChange2() 메소드를 설정하면 버튼 클릭 시 저 메소드가 실행되어 씬이 전환 됩니다. Stage 2 씬의 메인 카메라에도 스크립트를 붙여주고, 버튼 Onclick() 메소드에 SceneChange1() 메소드를 붙여주도록 합시다.