Galaxy Ball/1. 멀티플레이 - 대전모드

(17) inGame Scene #Pause

DOlpa_GB 2024. 4. 3. 12:59

모든 씬들이 전부 연결된줄 알았지만 한가지 놓친게 있었다. 바로 인게임씬과 다른 씬들과의 연결이었다. 

아이템에 본격적으로 넘어가기전에, 다른 모든걸 전부 구현을 시키고 넘어가고 싶기에 이것까지만 구현하고 넘어가겠다

 

이번 글에서 구현하려는건 크게 2가지. 일시정지 버튼과 일시정지 버튼을 누르면 나오는 선택창이다

 

 

우선 일시정지 버튼부터 만들어보겠다. 적당한 아이콘 이미지를 구한뒤 버튼 소스이미지에 붙여준다

 

이번엔 일시정지 버튼을 누르면 활성화될 창을 만들어보겠다

 

활성화될 창은 좌측상단에 있는 메인창을 잘라 써보겠다

 

그림판으로 적당히 잘라준뒤 리소스로 쓰일수 있도록 백지 상태로 수정해주자

 

그리고 버튼과 텍스트들을 하나씩 만들어 붙여주자

여기서 중요한건 버튼 클릭에 활성화/비활성화가 이루어져야 하므로 한 오브젝트안에 모든 요소들을 전부 넣어준다

 

Pause화면에서 구현해야할건 총 4가지

-X : 창 닫기

-RESUME : 창 닫기

-RESTART : 게임 재시작

-MAIN MENU : 메인 메뉴로 씬변환

 

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

public class MainButtonManager : MonoBehaviour
{
    public Button Stopbtn;
    public GameObject Stop_Channel;
    public AudioSource ButtonAudio;
    void Start()
    {
        Stopbtn.onClick.AddListener(StopbtnOnClick);
    }
    void StopbtnOnClick()
    {
        ButtonAudio.Play();
        Stop_Channel.gameObject.SetActive(true);
    }
}

 

이제 스크립트를 작성해주자. MainScene에서 버튼을 조작하는 스크립트이니 새로운 이름으로 만들어준다

스크립트는 GameManager에 넣어주었다. 전체적인 경기를 조작하는 GameManager 스크립트도 함께 있다

 

우선 여기까지만 짜고 결과를 보자. Stop버튼을 클릭하면 Stop_Channel이 활성화 되도록 구현해보았다

 

 

 

잘 동작하는것을 볼수 있다. 이제 버튼 각각의 기능들을 구현해보도록 하자

 

-X : 창 닫기

-RESUME : 창 닫기

-RESTART : 게임 재시작

-MAIN MENU : 메인 메뉴로 씬변환

 

사실상 첫번째와 두번째 버튼은 같은 기능이다.

하지만 구석에 있는 X버튼까지 구현하는 디테일을 위해서니 한번 더 반복해주자

 

문제는 우측상단에 있는 X 버튼 소스를 따야하는데 이미지가 박스안에 붙어있는 탓에 떼어낼수도 없고,

겨우 떼어내서 배경을 투명하게 하자니 배경이 흰색이라 벗겨내지도 못한다

 

그래서 그냥 X 리소스만 따로 구해와 색을 최대한 비슷하게 따서 입혀준뒤 배경을 투명하게 제거해주었다

이제 이 이미지를 유니티에서 생성한 구체위에 입혀 버튼을 만들어보겠다

 

우선 그림판에서 이미지를 2개 불러온다

 

버튼이니 왼쪽 X 주변에 원모양 테두리를 만들어줘야 할것이다.

그 테두리의 색이 중요한데 무난하게 검정으로 테두리를 치기에는

오른쪽의 원본과 차이가 날 뿐더러 백그라운드 창에 잘 묻어나지도 않게된다. 그래서 원본도 함께 가져온 것이다

 

원본 이미지에서 x버튼 주변 테두리 색을 따서 직접 원을 그려주자

 

아...근데 문제가 생겼다. 여기서 배경을 투명하게 만들어주니 원안에 있는 배경공간도 전부 투명하게 만들어버린다

그렇다고 배경을 흰색이 아닌 다른 색으로 할수도 없고..

 

그래서 혹시나 하는 마음에 배경에 아주 살짝 채도를 섞어주자 함께 투명해지지 않는것을 확인할 수 있었다

 

완전 흰색의 명도가 240이니 프로그램이 흰색으로 인식하지 않고 자동으로 제거하지 않을 명도를 하나하나 돌려가며

알아보니 233이 마지노선임을 알 수 있었다

 

그래도 다른 색으로 할바엔 이게 어딘가. 이 정도로 만족하고 사용하는걸로 하자

포토샵만 잘 다뤘다면 이런 반복작업 같은거 안해도 될텐데.. 아쉬운 부분이다

 

전후 비교

 

오ㅋㅋ 그래도 정말 감쪽같다. 오히려 x선이 얇은게 더 내 취향이기도 하다

 

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

public class MainButtonManager : MonoBehaviour
{
    public Button Stopbtn;
    public Button Xbtn;
    public Button Resume;

    public GameObject Stop_Channel;
    public AudioSource ButtonAudio;
    void Start()
    {
        Stopbtn.onClick.AddListener(StopbtnOnClick);
        Stopbtn.onClick.AddListener(XOnClick);
        Stopbtn.onClick.AddListener(ResumeOnClick);
    }
    void StopbtnOnClick()
    {
        ButtonAudio.Play();
        Stop_Channel.gameObject.SetActive(true);
    }
    void XOnClick()
    {
        ButtonAudio.Play();
        Stop_Channel.gameObject.SetActive(false);
    }
    void ResumeOnClick()
    {
        ButtonAudio.Play();
        Stop_Channel.gameObject.SetActive(false);
    }
}

 

이제 Resume과 X버튼 둘다 기능을 구현해주자

 

근데 이렇게 스크립트를 짜고 실행해보니

 

 

Resume이나 x버튼을 누르면 아무런 변화도 일어나지 않고 오히려 stopbtn을 누르니 창이 비활성화가 된다

설마 역할이 바뀐건가 싶어 true,false값을 바꿔보아도 결과는 똑같다

 

아무리 봐도 이 코드에는 문제가 없는데 왜 이러나 싶어 한참을 고민하다 예전에 쓰던 코드형식으로 바꿔보았다

 

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

public class MainButtonManager : MonoBehaviour
{
    public Button Stopbtn;
    public Button Xbtn;
    public Button Resume;

    public GameObject Stop_Channel;
    public AudioSource ButtonAudio;
    void Start()
    {
        this.Stopbtn.onClick.AddListener(() =>
        {
            this.Stop_Channel.gameObject.SetActive(true);
        });
        this.Xbtn.onClick.AddListener(() =>
        {
            this.Stop_Channel.gameObject.SetActive(false);
        });
        this.Resume.onClick.AddListener(() =>
        {
            this.Stop_Channel.gameObject.SetActive(false);
        });
    }
}

 

 

이 코드에는 잘 작동하는것을 확인할 수 있다. 이유는 모르겠지만 아무튼 이 코드가 더 보기도 쉽고 편하니 

우선은 이렇게 사용하는걸로 하겠다

 

-RESTART : 게임 재시작

-MAIN MENU : 메인 메뉴로 씬변환

 

이번엔 이 두가지를 기능구현해보자

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

public class MainButtonManager : MonoBehaviour
{
    public Button Stopbtn;
    public Button Xbtn;
    public Button Resume;
    public Button Restart;
    public Button Main_menu;

    public GameObject Stop_Channel;
    public AudioSource ButtonAudio;
    void Start()
    {
        this.Stopbtn.onClick.AddListener(() =>
        {
            ButtonAudio.Play();
            this.Stop_Channel.gameObject.SetActive(true);
        });
        this.Xbtn.onClick.AddListener(() =>
        {
            ButtonAudio.Play();
            this.Stop_Channel.gameObject.SetActive(false);
        });
        this.Resume.onClick.AddListener(() =>
        {
            ButtonAudio.Play();
            this.Stop_Channel.gameObject.SetActive(false);
        });
        this.Restart.onClick.AddListener(() =>
        {
            ButtonAudio.Play();
            this.Stop_Channel.gameObject.SetActive(false);
            SceneManager.LoadScene("Main Scene");
        });
        this.Main_menu.onClick.AddListener(() =>
        {
            ButtonAudio.Play();
            this.Stop_Channel.gameObject.SetActive(false);
            SceneManager.LoadScene("Start Scene");
        });
    }
}

 

사실 이것도 간단하다. 버튼 클릭 소리를 내고, Stop_Channel 창을 닫는기능에다 각자의 씬으로 변환해주는 코드만

추가해주면 된다

 

 Restart 기능 역시 위 코드처럼 현재 씬을 다시 불러온다면 초기화가 되기 때문에 Restart 기능이 자연스럽게 되는것이다 

 

 

 

이제 모든 일시정지 중 버튼 기능들이 전부 구현되는것을 확인할 수 있다

 

반응형