Unity 물품 픽업, 배달, 삭제 시스템 구현 가이드

GoGoComputer·2024년 10월 28일

unity2d game

목록 보기
15/17
post-thumbnail

1. 개요

이번 실습에서는 다음과 같은 기능을 구현합니다:

  • 여러 개의 물품(Package) 배치: 게임 씬(Scene)에 여러 개의 물품을 배치합니다.
  • 물품 픽업과 삭제: 플레이어가 물품을 픽업하면 해당 물품이 게임에서 사라집니다.
  • 물품 배달 제한: 플레이어는 한 번에 하나의 물품만 가질 수 있으며, 배달하기 전까지 다른 물품을 픽업할 수 없습니다.
  • 배달 후 새로운 물품 픽업: 물품을 배달한 후에 다시 다른 물품을 픽업할 수 있습니다.

2. 단계별 설명

2.1 물품 복제 및 배치

  1. 물품 복제:
    • Hierarchy 창에서 기존의 물품 오브젝트를 선택합니다.
    • Ctrl + D를 눌러 물품을 복제합니다.
  2. 물품 배치:
    • 복제된 물품을 원하는 위치로 드래그하여 배치합니다.
    • 필요한 만큼 물품을 복제하여 게임 맵 곳곳에 배치합니다.

2.2 불필요한 오브젝트 제거

  • 게임 진행에 필요 없는 오브젝트(예: 테스트용으로 사용했던 원)를 삭제하여 깔끔한 씬을 구성합니다.

2.3 물품을 픽업하면 사라지게 만들기

2.3.1 오브젝트를 삭제하는 방법

  • Destroy 함수: 게임 오브젝트를 삭제할 때 사용하는 함수입니다.
    • 문법: Destroy(삭제할 오브젝트, 딜레이 시간);
    • 예시: Destroy(gameObject, 0.5f); // 0.5초 후에 오브젝트 삭제

2.3.2 Destroy 함수 적용하기

  • 물품을 픽업한 후 해당 물품 오브젝트를 삭제합니다.
  • 코드 수정:
    if (!hasPackage) // 물품이 없을 때만 픽업 가능
    {
        hasPackage = true;
        Debug.Log("물품이 픽업되었습니다.");
        Destroy(other.gameObject, destroyDelay); // 물품 삭제
    }
    • other.gameObject는 플레이어가 충돌한 물품 오브젝트를 가리킵니다.
    • destroyDelay는 오브젝트가 삭제되기까지의 지연 시간입니다.

2.3.3 딜레이 시간을 변수로 만들기

  • SerializeField 사용:
    [SerializeField] float destroyDelay = 0.5f;
    • destroyDelay 변수를 인스펙터에서 조정할 수 있도록 합니다.
    • 초기값은 0.5f로 설정합니다.

2.4 한 번에 한 개의 물품만 픽업 가능하게 만들기

  • 플레이어가 이미 물품을 가지고 있다면 새로운 물품을 픽업할 수 없도록 로직을 추가합니다.
  • 코드 수정:
    if (other.tag == "Package")
    {
        if (!hasPackage) // 물품이 없을 때만 픽업 가능
        {
            hasPackage = true;
            Debug.Log("물품이 픽업되었습니다.");
            Destroy(other.gameObject, destroyDelay); // 물품 삭제
        }
        else
        {
            Debug.Log("이미 물품을 가지고 있습니다.");
        }
    }
    • !hasPackagehasPackage == false와 동일한 의미로, 플레이어가 물품을 가지고 있지 않을 때를 의미합니다.

2.5 전체 로직 정리

  • 물품 픽업 시:
    • 플레이어가 물품과 충돌하고, 물품을 가지고 있지 않을 때만 픽업 가능합니다.
    • 픽업한 물품은 일정 시간 후에 게임에서 삭제됩니다.
  • 물품 배달 시:
    • 플레이어가 고객과 충돌하고, 물품을 가지고 있을 때만 배달 가능합니다.
    • 배달 후에는 hasPackage 변수를 false로 변경하여 새로운 물품을 픽업할 수 있게 합니다.

3. 작동 가능한 전체 실습 코드

아래는 위의 내용을 모두 반영한 전체 코드를 제공합니다.

using UnityEngine;

public class Delivery : MonoBehaviour
{
    [SerializeField] float destroyDelay = 0.5f; // 물품 삭제 딜레이 시간
    bool hasPackage = false; // 게임 시작 시 물품이 없음

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

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

4. 추가 설명

4.1 태그(Tag) 설정

  • 물품 오브젝트: 태그를 "Package"로 설정합니다.
  • 고객 오브젝트: 태그를 "Customer"로 설정합니다.
  • 태그 설정 방법:
    1. 해당 오브젝트를 선택합니다.
    2. 인스펙터 창 상단의 "Tag" 드롭다운 메뉴에서 적절한 태그를 선택하거나, 새로운 태그를 추가합니다.

4.2 Destroy 함수의 역할

  • Destroy() 함수는 지정된 오브젝트를 게임에서 삭제합니다.
  • 두 번째 인자인 destroyDelay는 삭제되기까지의 지연 시간을 나타냅니다.
    • 예: Destroy(other.gameObject, 0.5f);는 0.5초 후에 오브젝트를 삭제합니다.
  • 지연 시간을 사용하면 플레이어가 물품을 픽업하는 애니메이션이나 효과를 보여줄 시간이 생깁니다.

4.3 SerializeField의 활용

  • [SerializeField] 어트리뷰트를 사용하면 private 변수도 인스펙터에서 조정할 수 있습니다.
  • 이를 통해 코드를 수정하지 않고도 게임 플레이를 조정할 수 있습니다.
    • 예: destroyDelay 값을 0.5초에서 1초로 변경하여 물품이 사라지는 시간을 조절할 수 있습니다.

4.4 물품 픽업 로직 개선

  • 이미 물품을 가지고 있을 때 새로운 물품을 픽업하지 못하도록 제한하여 게임의 난이도를 조절합니다.
  • if (!hasPackage) 조건문을 사용하여 이 로직을 구현합니다.

4.5 디버그 메시지

  • Debug.Log() 함수를 사용하여 게임의 진행 상황을 콘솔에 출력합니다.
  • 이는 디버깅 및 게임 테스트에 유용합니다.
    • 예: 플레이어가 물품을 픽업하거나 배달할 때 메시지를 출력하여 정상적으로 동작하는지 확인합니다.

5. 테스트 방법

  1. 스크립트 적용:
    • 위의 Delivery 스크립트를 플레이어 오브젝트에 추가합니다.
  2. 태그 설정:
    • 물품 오브젝트에 "Package" 태그를 설정합니다.
    • 고객 오브젝트에 "Customer" 태그를 설정합니다.
  3. 물품 배치:
    • 여러 개의 물품 오브젝트를 씬에 배치합니다.
  4. 게임 실행:
    • 플레이 모드로 게임을 실행합니다.
  5. 플레이어 이동:
    • 플레이어를 움직여 물품을 픽업하고, 고객에게 배달합니다.
  6. 동작 확인:
    • 물품을 픽업하면 해당 물품이 일정 시간 후에 사라지는지 확인합니다.
    • 물품을 가지고 있을 때 다른 물품을 픽업할 수 없는지 확인합니다.
    • 물품을 배달한 후에 새로운 물품을 픽업할 수 있는지 확인합니다.

6. 요약

  • Destroy 함수 사용: 물품을 픽업한 후 해당 오브젝트를 삭제하여 게임에서 사라지게 합니다.
  • SerializeField 활용: 딜레이 시간을 인스펙터에서 조절할 수 있도록 하여 유연성을 높였습니다.
  • 물품 픽업 제한: 플레이어가 한 번에 하나의 물품만 가질 수 있도록 로직을 구현하여 게임 플레이를 개선했습니다.
  • 디버그 메시지: Debug.Log()를 통해 게임의 진행 상황을 추적하고 디버깅에 활용했습니다.

이렇게 해서 물품을 픽업하고 배달하는 기본적인 기능을 구현했습니다. 이 기능을 바탕으로 게임을 더욱 발전시킬 수 있을 것입니다.

profile
IT를 좋아합니다.

0개의 댓글