Unity에서 if문과 태그를 활용한 게임 오브젝트 상호작용 처리

GoGoComputer·2024년 10월 28일

unity2d game

목록 보기
14/17
post-thumbnail

part 1/2: if문과 태그

Unity에서 if문태그(tag)를 사용하여 게임 오브젝트와의 상호작용을 처리하는 방법을 자세히 알아보겠습니다. 마지막에는 실제로 작동하는 전체 코드를 제공해 드릴게요.

1. 물품 오브젝트 준비하기

1단계: 오브젝트 이름 변경

  • Hierarchy 창에서 기존의 Square 오브젝트를 선택합니다.
  • 이름을 Package로 변경합니다. 이 오브젝트는 플레이어가 픽업해야 하는 물품이 될 것입니다.

2단계: 물품 모양 수정

  • Package 오브젝트의 Sprite Renderer 컴포넌트에서 색상이나 모양을 변경하여 물품처럼 보이도록 수정합니다.

2. 스크립트 수정하기

1단계: 스크립트 이름 변경

  • Project 창에서 기존의 Collision 스크립트를 선택하고 F2 키를 눌러 이름을 Delivery로 변경합니다.

2단계: 클래스 이름 수정

  • Delivery 스크립트를 더블 클릭하여 Visual Studio나 원하는 코드 에디터에서 엽니다.
  • 스크립트 내부에서 public class Collisionpublic class Delivery로 변경합니다.
  • 클래스 이름과 파일 이름은 항상 동일해야 합니다.

3단계: Unity로 돌아가기

  • 스크립트를 저장하고 Unity로 돌아옵니다. Unity가 스크립트를 컴파일하고 업데이트합니다.

3. 태그(Tag) 사용하기

1단계: 태그 추가

  • Package 오브젝트를 선택하고 Inspector 창 상단의 Tag 드롭다운 메뉴를 클릭합니다.

  • Add Tag...를 선택하여 새로운 태그를 추가합니다.
  • 태그 목록에서 + 버튼을 클릭하고 새로운 태그 이름을 Package로 입력한 후 저장합니다.

2단계: 태그 적용

  • 다시 Package 오브젝트를 선택하고 태그를 방금 추가한 Package로 설정합니다.

4. if문으로 태그 확인하기

1단계: if문 이해하기

  • if문은 특정 조건이 참(true)인지 거짓(false)인지 판단하여 그에 따라 코드를 실행합니다.

  • 기본 구조는 다음과 같습니다:

    if (조건)
    {
        // 조건이 참일 때 실행되는 코드
    }

2단계: OnTriggerEnter2D 메서드 수정

  • Delivery 스크립트에서 OnTriggerEnter2D 메서드를 다음과 같이 수정합니다:

    void OnTriggerEnter2D(Collider2D other)
    {
        if (other.tag == "Package")
        {
            Debug.Log("물품이 픽업되었습니다.");
        }
    }
  • 이 코드는 플레이어가 태그가 Package인 오브젝트와 충돌했을 때 콘솔에 메시지를 출력합니다.

5. 고객 오브젝트 추가하기

1단계: 고객 오브젝트 생성

  • Hierarchy 창에서 우클릭하고 2D Object > Sprite > Square를 선택하여 새로운 오브젝트를 생성합니다.
  • 오브젝트 이름을 Customer로 변경합니다.
  • Sprite Renderer에서 색상을 구분하기 쉽게 변경합니다 (예: 파란색).

2단계: 콜라이더 추가 및 설정

  • Customer 오브젝트에 Box Collider 2D 컴포넌트를 추가합니다.
  • Is Trigger 옵션을 체크합니다.

3단계: 태그 추가 및 적용

  • Package 때와 마찬가지로 Customer 태그를 추가하고, Customer 오브젝트에 해당 태그를 적용합니다.

6. 스크립트에 고객 상호작용 추가하기

  • Delivery 스크립트에서 OnTriggerEnter2D 메서드를 수정하여 고객과의 상호작용을 추가합니다:

    void OnTriggerEnter2D(Collider2D other)
    {
        if (other.tag == "Package")
        {
            Debug.Log("물품이 픽업되었습니다.");
        }
        else if (other.tag == "Customer")
        {
            Debug.Log("물품이 배달되었습니다.");
        }
    }
  • 이제 플레이어가 Package와 충돌하면 "물품이 픽업되었습니다." 메시지가, Customer와 충돌하면 "물품이 배달되었습니다." 메시지가 출력됩니다.

7. 전체 코드

아래는 완성된 Delivery 스크립트의 전체 코드입니다:

using UnityEngine;

public class Delivery : MonoBehaviour
{
    void OnTriggerEnter2D(Collider2D other)
    {
        if (other.tag == "Package")
        {
            Debug.Log("물품이 픽업되었습니다.");
        }
        else if (other.tag == "Customer")
        {
            Debug.Log("물품이 배달되었습니다.");
        }
    }
}

8. 게임 실행 및 테스트

  • 스크립트를 저장하고 Unity로 돌아갑니다.
  • 게임을 실행하고 플레이어를 움직여 PackageCustomer 오브젝트와 충돌해 봅니다.
  • Console 창에서 각각의 메시지가 제대로 출력되는지 확인합니다.

추가 설명

  • 태그(tag)는 게임 오브젝트를 분류하고 식별하는 데 사용됩니다.
  • Collider2DIs Trigger 옵션을 체크하면 물리적 충돌 없이도 충돌 이벤트를 감지할 수 있습니다.
  • Debug.Log는 콘솔에 메시지를 출력하는 데 사용됩니다.

마무리

이렇게 해서 if문과 태그를 활용하여 특정 오브젝트와의 상호작용을 처리하는 방법을 배웠습니다. 이 방법은 게임에서 아이템 픽업, 퀘스트 완료, NPC와의 대화 등 다양한 상황에서 활용될 수 있습니다.

다음 시간에는 이 기능을 확장하여 물품을 픽업한 후 사라지게 하거나, 배달 완료 시 점수를 증가시키는 등의 추가 기능을 구현해 보겠습니다.

part 2/2: bool

Unity에서 배달 게임을 만들 때 발생할 수 있는 두 가지 문제를 해결해보려고 합니다:

  1. 플레이어가 고객 위를 그냥 지나가는 문제.
  2. 물품을 픽업하지 않아도 배달이 가능한 문제.

이 두 가지를 해결하기 위해서는 몇 가지 코드를 수정하고, 새로운 개념인 bool 타입 변수를 활용해야 합니다. 마지막에는 수정된 전체 코드를 제공하겠습니다.

문제 상황 이해하기

먼저 현재의 코드를 살펴보면, 플레이어가 물품(Package)이나 고객(Customer)과 충돌하면 각각 픽업과 배달 메시지가 출력됩니다. 하지만 실제로는 물품을 픽업하지 않아도 고객에게 가면 "물품이 배달되었습니다."라는 메시지가 출력됩니다. 이는 게임의 로직상 자연스럽지 않습니다.

또한, 플레이어가 고객 위를 밟고 지나갈 수 있는데, 이는 현실적인 게임 플레이를 방해합니다. 따라서 플레이어가 물품을 가지고 있을 때만 고객에게 배달할 수 있도록 로직을 수정해야 합니다.

bool 타입 변수 소개

이 문제를 해결하기 위해 bool 타입 변수를 사용하겠습니다. bool은 참(true) 또는 거짓(false) 두 가지 값만을 가질 수 있는 데이터 타입입니다. 게임 내에서 어떤 상태를 추적하거나 조건을 확인할 때 매우 유용합니다.

예를 들어, 플레이어가 물품을 가지고 있는지 여부를 bool 변수로 나타낼 수 있습니다. 이를 통해 플레이어가 물품을 가지고 있을 때만 배달이 가능하도록 조건을 설정할 수 있습니다.

단계별로 코드 수정하기

1. hasPackage 변수 추가하기

먼저, 플레이어가 물품을 가지고 있는지를 추적할 수 있는 bool 타입의 변수를 추가하겠습니다.

public class Delivery : MonoBehaviour
{
    bool hasPackage = false; // 게임 시작 시에는 물품을 가지고 있지 않음
    // 나머지 코드...
}

여기서 hasPackage라는 이름을 사용한 이유는 변수명이 그 목적을 명확하게 나타내기 때문입니다. 변수명을 지을 때는 해당 변수가 어떤 역할을 하는지 알기 쉽게 하는 것이 좋습니다.

2. 물품을 픽업할 때 hasPackage 값 변경하기

플레이어가 물품과 충돌했을 때 hasPackage 값을 true로 변경해야 합니다.

void OnTriggerEnter2D(Collider2D other)
{
    if (other.tag == "Package")
    {
        hasPackage = true; // 물품을 픽업함
        Debug.Log("물품이 픽업되었습니다.");
    }
    // 나머지 코드...
}

3. 고객에게 배달할 때 조건 추가하기

플레이어가 고객과 충돌했을 때, 물품을 가지고 있는 경우에만 배달이 이루어지도록 조건문을 수정합니다.

else if (other.tag == "Customer")
{
    if (hasPackage)
    {
        hasPackage = false; // 물품을 배달하고 다시 빈 상태로 변경
        Debug.Log("물품이 배달되었습니다.");
    }
    else
    {
        Debug.Log("물품이 없습니다. 배달할 수 없습니다.");
    }
}

여기서 중첩된 if 문을 사용하여 hasPackagetrue인 경우에만 배달 로직이 실행되도록 합니다.

4. 물품 재배달 방지하기

이제 물품을 배달한 후에는 hasPackagefalse로 변경했기 때문에, 다시 고객에게 가도 배달이 되지 않습니다. 이는 물품을 여러 번 배달하는 것을 방지합니다.

5. 디버그를 위한 Start() 메서드 활용하기 (선택 사항)

Start() 메서드를 사용하여 게임 시작 시 hasPackage의 초기 값을 확인할 수 있습니다.

void Start()
{
    Debug.Log("초기 hasPackage 값: " + hasPackage);
}

이 코드는 게임이 시작될 때 콘솔에 hasPackage의 초기 값이 무엇인지 출력해줍니다. 이를 통해 변수의 초기 상태를 확인할 수 있습니다.

전체 수정된 코드

아래는 위의 수정 사항들을 모두 반영한 전체 코드입니다.

using UnityEngine;

public class Delivery : MonoBehaviour
{
    bool hasPackage = false; // 게임 시작 시 물품이 없음

    void Start()
    {
        Debug.Log("초기 hasPackage 값: " + hasPackage);
    }

    void OnTriggerEnter2D(Collider2D other)
    {
        if (other.tag == "Package")
        {
            if (!hasPackage) // 물품이 없을 때만 픽업 가능
            {
                hasPackage = true;
                Debug.Log("물품이 픽업되었습니다.");
            }
            else
            {
                Debug.Log("이미 물품을 가지고 있습니다.");
            }
        }
        else if (other.tag == "Customer")
        {
            if (hasPackage)
            {
                hasPackage = false;
                Debug.Log("물품이 배달되었습니다.");
            }
            else
            {
                Debug.Log("물품이 없습니다. 배달할 수 없습니다.");
            }
        }
    }
}

코드 실행 결과 확인하기

이제 Unity 에디터로 돌아가서 게임을 실행해보세요. 아래와 같은 동작이 이루어질 것입니다.

  1. 물품 없이 고객에게 접근할 경우:

    • "물품이 없습니다. 배달할 수 없습니다."라는 메시지가 출력됩니다.
  2. 물품을 픽업한 후 고객에게 접근할 경우:

    • "물품이 배달되었습니다."라는 메시지가 출력되고, hasPackagefalse로 변경됩니다.
  3. 물품을 픽업한 후 다시 물품에 접근할 경우:

    • "이미 물품을 가지고 있습니다."라는 메시지가 출력됩니다. 이는 플레이어가 한 번에 하나의 물품만 가질 수 있도록 제한합니다.
  4. 물품을 배달한 후 다시 고객에게 접근할 경우:

    • "물품이 없습니다. 배달할 수 없습니다."라는 메시지가 출력됩니다.

결론

이렇게 bool 타입 변수를 활용하여 게임 내 상태를 관리하고, 조건문을 통해 원하는 게임 로직을 구현할 수 있습니다. 이러한 방법은 다양한 게임 개발 상황에서 매우 유용하게 사용됩니다.

bool 변수는 단순하지만 강력한 도구입니다. 게임 내에서 플레이어의 상태, 아이템 소지 여부, 특정 이벤트 발생 여부 등을 추적하는 데 많이 사용됩니다.

이번 예제에서는 hasPackage 변수를 사용하여 플레이어가 물품을 가지고 있는지 확인하고, 그에 따라 배달이 가능하도록 로직을 구현했습니다.

추가 팁

  • 태그 관리: Unity에서 오브젝트의 태그를 정확히 설정해야 합니다. PackageCustomer 태그가 정확히 설정되어 있는지 확인하세요.
  • 충돌 처리: 플레이어와 물품, 고객 오브젝트에 Collider와 Trigger 설정이 올바르게 되어 있는지 확인하세요.
  • 콘솔 확인: Debug.Log()를 활용하여 게임 실행 중 변수의 상태나 흐름을 확인하면 디버깅에 큰 도움이 됩니다.
profile
IT를 좋아합니다.

0개의 댓글