본문 바로가기
게임 프로그래밍/게임개발 중급

게임개발 중급(8) - 2D 플랫포머 게임 만들기(3)

by jyppro 2023. 4. 27.

2D 플랫포머 게임 만들기(3)

 

저번시간에는 바닥을 통해 좌우로 이동하고, 점프하는 플레이어를 만들어 보았습니다. 이번엔 아이템을 먹고 점수가 올라가도록 이어서 설계해보겠습니다.

 

먼저 아이템으로 사용할 오브젝트를 가져옵니다. 유니티 시스템에 있는 2D 오브젝트를 생성해서 사용해도 되지만, 유니티에는 수많은 무료 리소스를 사용할 수 있는 에셋스토어가 존재합니다. 저는 유니티 기본 UI를 사용하겠습니다.

 

우선 UI로 Text를 추가하고, 2D 오브젝트 Circle을 만들어 줍니다.

UI는 추가하면 Scene 뷰에서는 엄청나게 큰 테두리가 생성됩니다. 그것과 별개로 게임뷰에서는, 왼쪽아래 구석에 Text 글자가 조그만하게 보일 것입니다.

저희는 점수로 사용할 것이기 때문에 화면 중앙에 위치하도록 옮겨주고, Score : 0 라고 텍스트를 표시해주겠습니다. 이때, 인스펙터 창을 보시면 텍스트가 있고 맨위에 앵커포인트라는 게 있습니다. 이것은 화면의 크기비율에 맞춰서 해당 위치에 고정시키는 것을 의미합니다. 저는 앵커포인트를 왼쪽 상단에 맞춰보겠습니다.

 

씬뷰와 게임뷰 화면
씬뷰와 게임뷰 화면구성

 

UI 인스펙터 창
UI 인스펙터 창 화면

 

앵커포인트는 앵커의 위치를 원점(0,0,0) 설정하는 것으로, 위치를 제대로 잡아주려면 Transform 수치를 잘 조정해주어야 합니다. 이렇게 하면 UI 기본설정은 끝났습니다. 이제 코인스크립트를 작성하여 플레이어가 코인을 먹으면 점수가 올라가도록 표시해주어야 합니다.

 

코인스크립트 이야기를 하기전에, 알아둬야 할 점이 있습니다. 스크립트를 작성 할 때는 주어진 환경에서 어떠한 방식으로 작성하느냐가 매우 중요합니다. 같은 동작을 하더라도 더 간단한 코드로 가볍게 작성하는 방식이 있고, 불필요하게 복잡하게 작성되어지는 방식이 있습니다.

 

이번에 보여드릴 스크립트는 러프한 방식으로 작성된 코드입니다.

 

우선, 이전에 작성한 PlayerController에 퍼블릭으로 score을 선언합니다. 그리고 나서 ScoreManager를 만들어 줍니다.

 

using UnityEngine;
using UnityEngine.UI;

public class ScoreManager : MonoBehaviour
{
    public int scoreValue = 10;  // 코인 하나의 점수
    GameObject ST;
    GameObject player;

    void Start() {
        this.ST = GameObject.Find("ScoreText");   
        this.player = GameObject.Find("Player"); 
    }

    private void OnTriggerEnter2D(Collider2D other)
    {
        if (other.CompareTag("Player"))
        {
            this.player.GetComponent<PlayerController>().score += scoreValue;  // 점수 증가
            if(this.player.GetComponent<PlayerController>().score >= 0){
            this.ST.GetComponent<Text>().text = "Score: " + this.player.GetComponent<PlayerController>().score.ToString();}  // UI Text에 점수 반영
            Destroy(gameObject);  // 코인 아이템 제거
        }
    }
}

 

간단히 설명드리면, 코인점수 10점을 부여하고, ScoreText란 이름의 UI와 플레이어를 가져옵니다. 콜라이더가 부딪히면, 트리거가 작동하는데, 이번에도 태그로 Player판정을 해주었습니다. 플레이어 컨트롤러에 있는 스코어를 가져와서 10점만큼 더해주고 UI에 표시를 해주는 방식입니다.

 

이번에 주의해야 할 점은 플레이어에게도 콜라이더가 있지만, 부딪히는 대상에게도 콜라이더가 있어야 합니다. 그리고 트리거를 작동시키려면, 두 콜라이더 중 하나에는 isTrigger 옵션체크되어 있어야 합니다. 이렇게 작성하면 콜라이더와 ScoreManager 스크립트가 들어간 코인 오브젝트를 먹었을 때, 10점씩 오르는 것을 확인할 수 있습니다.

 

게임 시작 전 상태
게임 시작 전 상태

 

게임을 시작하고 코인 3개를 먹은 상태
게임을 시작하고 코인 3개를 먹은 상태

 

해당 코드는 작동은 잘 되지만, 사실 문제점이 있습니다. 스크립트를 코인에 적용하는 것에 집중한 나머지 점수계산을 플레이어에 있는 스코어를 가져와서 하기 때문에 쓸데없이 같은 코드를 반복해서 작성한 것이 보일 것입니다.

this.player.GetComponent<PlayerController>().score

해당 코드가 계속해서 반복됩니다. 이런 문제가 사소해 보일 수 있지만, 나중에 프로젝트가 커지고, 더 많은 기능들이 생겼을 때 문제를 일으킬 수 있습니다. 때문에 코드를 최적화 하는 것이 모든 개발자들의 평생숙제입니다.

다음엔, 해당 코드를 덜 복잡하게 최적화 시키는 법에 대해서 말씀드리겠습니다. 감사합니다.