Unity 강의 정리 4-5장: 소코반 게임 만들기 - 충돌 처리🎮

나무·2023년 8월 15일
1

Unity

목록 보기
8/21
post-thumbnail

인프런에 있는 레트로의 유니티 C# 게임 프로그래밍 에센스 강의를 듣고 정리하는 글입니다!

이번 장에서는 ItemBox와 EndPoint 객체간 상호작용(Trigger) 에 대한 기능을 구현할 것이다.


1. Is Trigger 속성에 대한 설명 🎯

Unity에서 충돌 처리를 하기 위해서는 Collider 컴포넌트가 필수적이다. Collider는 오브젝트의 물리적 경계를 정의하며, 다른 오브젝트와의 충돌을 감지한다.

그러나 모든 충돌이 물리적인 반응을 가져야 할 필요는 없다. "Is Trigger" 속성을 활성화하면 오브젝트가 물리적으로 부딪치지 않더라도 특정 이벤트를 발생시킬 수 있다.

  • Is Trigger 활성화 없음: 오브젝트가 물리적으로 부딪칠 때 반응한다. 예를 들어, 벽과 플레이어가 충돌하면 플레이어는 벽을 통과할 수 없다.
  • Is Trigger 활성화: 오브젝트가 물리적으로 부딪치지 않더라도 충돌을 감지한다. 예를 들어, 플레이어가 보이지 않는 트리거 영역을 지나가면 문이 열리는 등의 이벤트를 발생시킬 수 있다.

Is Trigger를 사용하려면:

  1. Unity Editor에서 오브젝트를 선택한다.
  2. Inspector 창에서 Collider 컴포넌트를 찾는다.
  3. "Is Trigger" 체크박스를 선택한다.

이제 이 오브젝트는 물리적으로 부딪치지 않더라도 충돌을 감지하고 OnTriggerEnter, OnTriggerExit, OnTriggerStay 등의 이벤트를 사용할 수 있다.


2. EndPoint 오브젝트에 Tag 설정해서 분류 🏷️

Unity에서 오브젝트를 효과적으로 관리하고 식별하려면 태그(Tag)를 사용할 수 있다. 태그는 오브젝트의 분류를 돕고, 코드 내에서 특정 오브젝트를 빠르게 찾을 수 있는 방법을 제공한다.

EndPoint 오브젝트에 태그를 설정하면, 그 오브젝트와의 충돌을 쉽게 감지하고 처리할 수 있다.

태그를 설정하는 방법은 다음과 같다:

  1. Unity Editor에서 EndPoint 오브젝트를 선택한다.
  2. Inspector 창의 상단에서 "Tag" 드롭다운 메뉴를 열고, 원하는 태그를 선택하거나 새 태그를 만든다.
  3. 새 태그를 만들 경우, "Add Tag..."를 클릭하고, "+" 버튼을 눌러 새 태그 이름을 입력한다.
  4. 다시 오브젝트를 선택하고, "Tag" 드롭다운에서 새로 만든 태그를 선택한다.

이제 코드 내에서 other.tag == "EndPoint"와 같은 조건문을 사용하여 EndPoint 오브젝트와의 충돌을 쉽게 식별하고 처리할 수 있다. 태그는 게임 로직을 단순화하고, 유연한 설계를 가능하게 하는 강력한 도구이다.


3. ItemBox가 EndPoint와의 충돌을 처리할 수 있도록 처리 🔄

Unity에서 충돌을 감지하려면 OnTriggerEnter 메서드를 사용할 수 있다. 이 메서드는 오브젝트가 충돌을 시작하는 순간 호출된다. 아래의 단계를 통해 ItemBox와 EndPoint의 충돌을 감지하고 처리할 수 있다:

  1. Tag 설정: 먼저, EndPoint 오브젝트에 "EndPoint" 태그를 설정해야 한다. 이를 통해 ItemBox가 EndPoint와 충돌하는지 쉽게 판별할 수 있다.

  2. Collider 설정: ItemBox에 Collider 컴포넌트를 추가하고 "Is Trigger"를 활성화해야 한다.

  3. 충돌 이벤트 작성: ItemBox 스크립트에 OnTriggerEnter 메서드를 작성하고, 충돌한 오브젝트의 태그를 확인한다:

void OnTriggerEnter(Collider other)
{
    if(other.tag == "EndPoint")
    {
        Debug.Log("충돌");
    }
}

4. EndPoint와 충돌시 ItemBox의 색깔을 변경 🌈

EndPoint와 충돌 시 ItemBox의 색깔을 변경하려면 다음과 같은 과정을 따른다.

  1. Renderer 컴포넌트 참조: 오브젝트의 렌더링에 관한 정보를 담고 있는 컴포넌트이다.
private Renderer myRenderer; // Renderer 컴포넌트 참조 변수
  1. Renderer 컴포넌트 할당: Start 메서드에서 오브젝트에 붙어있는 Renderer 컴포넌트를 찾아 변수에 할당한다.
void Start()
{
    myRenderer = GetComponent<Renderer>(); // Renderer 컴포넌트 할당
}
  1. 충돌 이벤트 처리: OnTriggerEnter 메서드는 Trigger 옵션을 활성화한 Collider와 충돌 시 호출된다.
void OnTriggerEnter(Collider other)
{
    if(other.tag == "EndPoint") // EndPoint 태그와 충돌 시
    {
        myRenderer.material.color = Color.red; // 색깔을 빨간색으로 변경
    }
}

5. 충돌이 끝나고 원래 색으로 돌아오기 🎨

충돌이 종료된 후 원래 색으로 복귀하려면 원래 색을 저장하고 OnTriggerExit 메서드를 활용한다.

  1. 원래 색 저장: Start 메서드에서 원래 색을 저장한다.
private Color originalColor; // 원래 색을 저장할 변수

void Start()
{
    originalColor = myRenderer.material.color; // 원래 색 저장
}
  1. 충돌 종료 이벤트 처리: OnTriggerExit 메서드는 Trigger 옵션을 활성화한 Collider와의 충돌이 끝날 때 호출된다.
void OnTriggerExit(Collider other)
{
    if(other.tag == "EndPoint") // EndPoint 태그와의 충돌 종료 시
    {
        myRenderer.material.color = originalColor; // 원래 색으로 복귀
    }
}

이러한 방식을 통해 EndPoint와의 충돌을 감지하고 ItemBox의 색깔을 동적으로 변경할 수 있다.


6. 번외 학습 내용: Rigidbody의 Drag 설정 🏋️

Rigidbody는 Unity에서 물리적 특성을 오브젝트에 적용하는 컴포넌트이다.

  1. Drag 속성의 정의: Drag는 공기저항이나 마찰과 같은 힘을 표현한다. 오브젝트가 움직이는 방향과 반대로 작용하는 힘이다.

  2. Drag의 역할: Drag 값을 높이면 오브젝트의 움직임이 점점 둔해진다. 예를 들어, 공을 던지면 공기 저항으로 인해 점점 속도가 감소한다.

  3. Drag 설정 방법: Inspector창이나, Rigidbody 컴포넌트에서 Drag 속성을 직접 설정할 수 있다.

Rigidbody rb = GetComponent<Rigidbody>();
rb.drag = 10.0f; // Drag 값을 5로 설정

🎓 정리

이번 장에서는 EndPoint와 ItemBox의 충돌 처리, 색상 변경, 원래 색으로의 복귀, 그리고 Rigidbody의 Drag 설정에 대해 배웠다. 또한 Rigidbody의 Drag 설정은 오브젝트의 움직임을 더 자연스럽게 만들어준다.

전체 코드
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ItemBox : MonoBehaviour
{
    private Renderer myRenderer; // ItemBox의 Renderer 컴포넌트를 참조
    public Color touchColor;     // 충돌시 바뀔 색을 참조할 변수

    void Start()
    {
        myRenderer = GetComponent<Renderer>(); // Renderer 컴포넌트를 가져옴
    }

    void Update()
    {
        // 매 프레임마다의 로직은 여기에
    }

    // 트리거 콜라이더와 충돌했을 때 자동으로 실행
    private void OnTriggerEnter(Collider other)
    {
        if (other.tag == "EndPoint")            // 태그가 "EndPoint"일 경우
        {
            myRenderer.material.color = touchColor; // 색을 touchColor로 변경
            Debug.Log("충돌");                 // 콘솔에 "충돌" 로그 출력
        }
    }

    // 트리거 콜라이더와 충돌이 끝났을 때 자동으로 실행
    private void OnTriggerExit(Collider other)
    {
        if (other.tag == "EndPoint")            // 태그가 "EndPoint"일 경우
        {
            myRenderer.material.color = Color.white; // 색을 흰색으로 변경
            Debug.Log("충돌 해제");             // 콘솔에 "충돌 해제" 로그 출력
        }
    }
}
profile
개인 공부를 정리함니다

0개의 댓글