DNF LOVE

[Unity-2D 러닝 게임 만들기 7] 최종, Coin과 충돌하여 Coin은 사라지고 Score에 점수가 오르는 이벤트 구현 본문

Programming/Unity

[Unity-2D 러닝 게임 만들기 7] 최종, Coin과 충돌하여 Coin은 사라지고 Score에 점수가 오르는 이벤트 구현

botho 2019. 8. 1. 17:57
반응형

우리의 게임 최종적 모습은 이렇게 된다.

순서대로 구현해보도록 하자!


1. Player와 Coin이 부딪치면 Coin이 사라지도록 하자.(gameobject Destroy)

우리가 자주 하는 쿠x런을 떠올려 보도록 하자. 쿠키가 젤리를 먹으면 어떻게 되는가? 젤리는 플레이어가 움직임과 동시에 사라지고 점수가 올라가지 않는가?

그렇다면 플레이어와 코인이 부딪치면 코인이 사라지는 것을 구현해야 한다.

그럴때 사용하는 것이 Object.Destroy함수이다! Destroy함수는 gameobject, 시간을 매개변수로 갖고 있는 함수이다.

첫번째 매개변수는 사라질 Object를 나타내고, 두 번째 매개변수 시간 t는 Destroy함수가 호출되고 몇 초 뒤에 Object가 사라지는 것을 설정하기 위해서 존재한다. gameObject는 반드시 필요한 매개변수 이며, T는 생략 가능하다. 생략하면 함수가 호출되자 마자 오브젝트가 사라진다.

void OnTriggerEnter2D(Collider2D o){
        if(o.gameObject.tag == "Coin")
        {
            print(o.gameObject.name);  
            Destroy(o.gameObject);
        }
}

충돌한 오브젝트의 태그가 Coin이라면, 부딪친 해당 오브젝트를 바로 없어지도록 한다.

이렇게 말이다!


2. Script에서 UI 변수를 할당받자.

이전 포스팅들 중, Script에서 객체들을 변수로 할당하는 방법을 배웠다.

UI또한 객체이므로 Script에서 할당받을 수 있다.

UI는 UnityEngine 자식 컴포넌트이다. 이를 사용하기 위해서는 스크립트 맨 위에 

'using UnityEngine.UI;"을 추가해줘야 사용할 수 있다.

우선 점수를 받아올 Text와 int형의 변수를 각각 선언하도록 하자.

ScoreShow라는 이름을 갖고 있는 Text 개체를 PlayerControler라는 스크립트에 받아오는 방법은 두 가지 정도가 있다.

첫 번쨰, 전에 설명한 대로 Start나 Awake함수와 같이 오브젝트가 활성화 될 때 동적으로 할당받는 방법이다.

(정수형 score는 게임이 시작되면 점수는 0으로 초기화를 해야 되므로 함께 0으로 초기화 해주도록 하자)

void Start()
    {
        rd = this.gameObject.GetComponent<Rigidbody>();

        move = this.gameObject.transform.position;

        score = 0;

        txt = GameObject.Find("ScoreShow").GetComponent<Text>();
	Debug.Log(txt.name);
    }

이렇게 사용한다. 이러고 실행을 하면, 

Player가 시작됨과 동시에 ScoreShow라는 Text를 할당받게 된다.

두 번째, 변수의 접근제한자를 public으로 바꾼 다음, Inspector창에서 직접 설정하는 방법이다.

접근제한자를 public으로 두면 게임 inspector창에서 변수를 바로바로 확인할 수 있기 때문이다.

public Text txt; 이렇게 변수를 선언해두고, 하이라키창에서 ScoreShow를 끌어다가 해당 위치에 끌어오면 된다.


2. txt의 Text부분을 score 변수의 값으로 할당받기.

Unity에서 Text는 String변수로 받는다. 그렇지만 Score는 정수형이지 않는가? 이럴 때 어떻게 해야 하는가 하면 형변환을 해주어야 한다.

c#에서 String을 int로, int를 String으로 형변환 해보도록 하자. 자주쓰이니 외우도록 하자.

// String to int
String str = "1234"
// #1
int score = Convert.ToInt32(str);
// #2
int score2 = Int32.Parse(str);

// int to String
int score = 0;
String str = score.ToString();

그렇다면 scroeShow를 할당받은 Text변수 txt의 Text를 정수형 score로 할당받아 보도록 하자.

초기화는 Start함수에서 txt.text = score.ToString(); 라고 해주자.

txt의 하위 text를 정수형 score를 String으로 형변환 한 값으로 할당해주겠다는 뜻이다.


3. Coin을 먹을때마다 점수 증가 하기

Player와 Coin이 부딪칠때마다 Score의 점수가 올라가는 것을 구현하도록 하자.

이전에 다뤘던 OnTriggerEnter함수 부분을 보도록 하자.

void OnTriggerEnter2D(Collider2D o){
        if(o.gameObject.tag == "Coin")
        {
            print(o.gameObject.name);  
            Destroy(o.gameObject);
            score += 1;
            txt.text = score.ToString();
        }
    }

만약 부딪친 오브젝트의 태그가 Coin이라면, 해당 오브젝트의 이름을 출력하고,

해당 오브젝트를 바로 삭제하면서 정수형 score를 자기자신과 1을 더해주며,

더해준 그 정수를 String으로 형변환 하여 txt의 text로 할당해주겠다는 뜻이다.

이러고 게임을 실행해 보도록 하자.

어떤가? Coin을 먹을때마다 Score가 변하는 모습을 확인되지 않는가? 우앙 ㅋ 굳 ㅋ 신기하여라.


2장이 이렇게 끝마쳤다.

어떤가 Unity를 통해 게임을 개발하니 금방 끝나지 않는가?

코드에 정답이 없듯이 개발 또한 정답이 없다.

지금 내가 이렇게 이런 저런 기능들을 구현하였는데, 같은 결과를 내더라도 다른 방식으로 코드를 구현할 수 있고,

내 코드보다 더 좋은 성능을 낼 수도 있다.

코드에 정답이 없고, 그리고 개발자들의 다양한 결정을 할 수 있도록 Unity에선 다양한 기능들을 지원해주니 여러 시도와 테스트를 하며 공부를 해보는 것을 권유해보고 싶다.

반응형