유니티_Ui와 Scene

avatar
2025.04.22
·
5 min read

UI 구성

  • 우측 하단에 탱크 포탄발사 버튼을 만든다.

  • 버튼을 누르면 탱크는 포탄을 발사한다.

  • 게임 상단에 Score 텍스트를 만든다.

  • Score는 게임 매니저의 스코어와 동일하게 표현되도록 한다.

  • (단, UI는 화면 해상도와 무관하게 정해진 위치에 자리해야 한다.)

5449

UI는 다음과 같이 구성했다.

각 UI 구성요소들의 Rectangle을 이동시켜 해상도가 변하더라도 위치가 변하지 않게 만들었다.

5450

Fire 버튼은 간단하게 이벤트로 포탑의 shot.Fire를 호출하도록 만들었다.

[SerializeField] TMP_Text ScoreText;

void OnEnable()
{
    GameManager.OnScoreChanged += SetScoreText;
}
void OnDisable()
{
    GameManager.OnScoreChanged -= SetScoreText;
}
void SetScoreText(int score)
{
    ScoreText.text = score.ToString();
}

Score쪽 코드는 다음처럼 점수를 바꾸는 함수를 만들어 GameManager의 이벤트가 발생할때만 호출하도록 만들었다.

private int score;
public int Score 
{get { return score; } set { score = value; OnScoreChanged?.Invoke(Score); } }

void Start()
{
    Score = 0;
    OnScoreChanged?.Invoke(Score);
}

GameManager에 추가한 코드.

Start시 스코어를 초기화하고 이벤트를 Invoke해 0점을 띄워주도록 만들었다.

그 이후엔 값에 변동이 있을때만 이벤트가 발생 할 것이다.

5451

원하던 대로 잘 적용되었다.

에셋 스토어 사용

  • 좌측 하단에 조이스틱 UI를 구성한다.

  • 조이스틱을 움직이면 탱크는 이동한다.(이동 방식은 자유)

  • 조이 스틱은 에셋스토어에 검색하여 사용한다.

5453

먼저 에셋을 다운받는다.

위 무료 에셋을 사용하였다.

5454

UI상에 조이스틱을 배치하고 코드를 살펴보자

해당 에셋은 Horizontal, Vertical이라는 변수가 조이스틱의 값을 저장하니 해당 값을 사용하도록 하자.

[SerializeField] Joystick joystick;

public Vector3 GetNormalizedDirection()
{
    Vector3 direction = Vector3.zero;

    direction.x = joystick.Horizontal;
    direction.z = joystick.Vertical;

    if (Input.GetKey(KeyCode.UpArrow))
    {
        direction.z += 1;
    }
    if (Input.GetKey(KeyCode.DownArrow))
    {
        direction.z -= 1;
    }
    if (Input.GetKey(KeyCode.LeftArrow))
    {
        direction.x -= 1;
    }
    if (Input.GetKey(KeyCode.RightArrow))
    {
        direction.x += 1;
    }
    return direction.normalized;
}

기존 탱크의 움직임을 담당하는 코드에서 조이스틱의 값을 넣는 코드를 추가한다.

5460

아주 잘 동작한다.

씬 로딩

  • 타이틀씬 구현(게임시작, 게임종료)

  • 게임씬에 여러맵을 만들어서 이동시에 맵을 로딩하도록 구현

5463

먼저 타이틀씬과 UI를 구성한다.

public class TitleManager : MonoBehaviour
{
    public void StartButton()
    {
        SceneManager.LoadScene("Game");
    }
}

TitleManager를 구성한다.

굳이 TitleManager까지 만들 이유는 없지만 후에 여러 기능이 생길수도 있으니 미리 만들어놓자.

5462

Start 버튼 클릭 이벤트에 TitleManager.StartButton을 연결하자.

5464

Title은 잘 구현되었다.

이번엔 맵과 맵 로딩을 구현하자.

5465

다음처럼 맵 하나를 더 만들어 두 맵을 이어주자.

5466

플레이어가 들어오면 맵을 로드할 충돌체를 만든다.

void OnTriggerEnter(Collider other)
{
    if(other.CompareTag("Player"))
    {
        SceneManager.LoadSceneAsync("GameMap2", LoadSceneMode.Additive);
    }
}
void OnTriggerExit(Collider other)
{
    if(other.CompareTag("Player"))
    {
        SceneManager.UnloadSceneAsync("GameMap2");
    }
}

그리고 위 같은 코드를 적용시키면,

5467

플레이어가 트리거에 닿을 때 맵을 로드하고 플레이어가 나가면 언로드하게 된다.