유니티(Unity)/2D 게임 만들기

2D 게임 만들기 (7) Collider, Tag를 이용한 점수 내기

Whiny 2021. 6. 8. 13:23

지난 포스팅에서는 GameController가 가진 Score(int)의 값으로 Canvas 위에 해당 값을 표시하는 내용까지 다뤘습니다.

 

그러면 이제 Score(int)의 값을 변화시키려면 GameController의 GetScore 함수를 호출 해야합니다.

public void GetScore() {
score += 100; SetText();
}

우선 Gem, 우리의 점수를 올려줄 오브젝트를 준비해봅시다.

 

Gem의 sprite파일은 Sunnyland -> artwork -> Sprites -> Items -> gem폴더에 있습니다.

 

https://whiny.tistory.com/10

 

2D 게임 만들기 (2) Animator, 유한 상태 머신 사용하기

이번 포스팅에서는 Animator 창에서 유한 상태 머신을 이용해보겠습니다. 유한 상태 머신(Finite State Machine)이란 유한(Finite)한 수의 상태(State)가 있고, 한 번에 한 상태만 되도록 설계하는 방법입니

whiny.tistory.com

제가 포스팅한 글을 참고하면 쉽게 만들수 있을겁니다.

 

단순히 Gem폴더안의 sprite를 무한루프하며 재생하는 Animator를 만드시면 됩니다.


자 그리고 이렇게 만든 Gem 오브젝트에 Box Collider 2D 컴포넌트를 추가한 뒤, Is Trigger를 체크 해줍니다.

 

여기서 Collider의 Trigger 속성을 넣어주면

 

Collider를 가진 게임 오브젝트 간의 물리적 연산을 하지 않고 충돌을 감지하게 됩니다.

 

즉, 서로 밀려나지 않고, 그냥 통과하게 됩니다. 그래서 Trigger는 주로 특정 구역에 들어가는 경우, 충돌은 필요하지만 물리적 연산은 필요하지 않을 경우 사용합니다.

 

저는 캐릭터가 Gem을 획득하길 원하고 Gem 위에 올라타는 것을 원하지 않기 때문에 Trigger속성을 사용했습니다.

 


그리고 캐릭터에게도 Box Collider 2D를 하나 더 추가해 줍니다.

 

마찬가지로 Trigger를 지정해주었습니다. 그 이유는,

 

1. 기존에 캐릭터가 가지고 있던 Box Collider 2D는 발판을 감지하기 위해 물리적 충돌만을 생각하고 만듬

2. 캐릭터 이미지 크기와 크기가 맞는 영역을 지정해서 Gem과 충돌을 감지하기 위함


현재 저희의 캐릭터와 Gem은 충돌을 감지하고 있을 것입니다. 하지만, 어떤 물체인지 판단하기 위해서 Tag를 사용하도록 하겠습니다

Gem 오브젝트를 선택하고, 인스펙터 창의 Tag -> Add Tag를 통해 Gem Tag를 새로 만들어줍니다.

 

결과

이제 Tag를 이용한 충돌 오브젝트 판단을 해보겠습니다.

 


PlayerController를 살펴봅시다.

public class PlayerController : MonoBehaviour
{
    private PlayerInput playerInput;
    private Rigidbody2D playerRigidBody;
    public Collider2D footCollider;
    public float moveSpeed;
    public float jumpForce;
    bool island = true;
    GameController gameController;
    
     void Start()
    {
        playerInput = GetComponent<PlayerInput>();
        playerRigidBody = GetComponent<Rigidbody2D>();
        gameController = FindObjectOfType<GameController>();
    }

우선 GameControllerGetScore함수에 접근하기 위해서  gameController변수를 하나 선언하고 초기화합니다.

    private void OnTriggerEnter2D(Collider2D collision)
    {
        if(collision.tag == "Gem")
        {
            gameController.GetScore();
            GameObject.Destroy(collision.gameObject);
        }
    }

 

그리고 OnTriggerEnter2D함수를 추가해줍니다.

 

OnTriggerEnter함수는 게임 오브젝트가 Collider를 가지고 있을 때, Trigger에 Collision(다른 충돌 오브젝트)가 충돌하면 자동으로 호출됩니다.

 

매개변수로는 충돌한 오브젝트가 전달됩니다.(collision)

 

그리고 if문으로 collision.tag가 Gem인지 확인해서 GetScore()를 호출하고, 충돌한 오브젝트는 Destroy합니다.

 

이제, 캐릭터를 조종하여 Gem을 획득하면, Score가 갱신되고 Gem은 사라지는 효과를 만들었습니다.

 

결과물