Unity에서 물품 픽업 및 배달 시 차량 색상 변경을 통한 시각적 피드백 구현

GoGoComputer·2024년 10월 28일

unity2d game

목록 보기
16/17
post-thumbnail

Unity에서 플레이어가 물품을 픽업하고 배달할 때 시각적인 피드백을 주기 위해 차량의 색상을 변경하는 방법에 대해 자세히 알아보겠습니다. 이 과정에서 스프라이트 렌더러(Sprite Renderer)를 활용하여 차량의 색상을 동적으로 변경하는 방법을 배워보겠습니다.

시작하기 전에

우선, Unity에서 2D 게임을 개발하고 있다고 가정하겠습니다. 플레이어는 차량을 조종하며, 맵 위에 놓인 물품(Package)을 픽업하고 고객(Customer)에게 배달하는 게임입니다. 이때, 플레이어에게 물품을 픽업하거나 배달했을 때 시각적인 피드백을 주기 위해 차량의 색상을 변경하고자 합니다.

목표

  • 물품을 픽업하면: 차량의 색상이 초록색으로 변경됩니다.
  • 물품을 배달하면: 차량의 색상이 원래 색상으로 돌아옵니다.

전체적인 흐름

  1. Sprite Renderer 컴포넌트 접근하기: 차량의 스프라이트 렌더러 컴포넌트에 접근하여 색상을 변경할 수 있도록 합니다.
  2. 색상 변수 선언하기: 픽업 시와 배달 시에 사용할 색상을 변수로 선언합니다.
  3. 색상 변경 로직 추가하기: 물품을 픽업하거나 배달할 때 해당 색상으로 차량의 색상을 변경합니다.

단계별로 살펴보기

1. Sprite Renderer 컴포넌트 접근하기

Sprite Renderer란?

  • Sprite Renderer는 2D 스프라이트를 화면에 렌더링하는 역할을 하는 컴포넌트입니다.
  • 이 컴포넌트를 통해 스프라이트의 이미지, 색상, 뒤집힘 여부 등을 조절할 수 있습니다.

코드에서 컴포넌트에 접근하기

  • GetComponent() 메서드를 사용하여 원하는 컴포넌트에 접근할 수 있습니다.
  • 이를 통해 스크립트에서 스프라이트 렌더러의 속성에 접근하고 변경할 수 있습니다.

코드 구현

// 클래스 변수로 스프라이트 렌더러를 선언합니다.
SpriteRenderer spriteRenderer;

void Start()
{
    // Start() 메서드에서 스프라이트 렌더러 컴포넌트를 가져옵니다.
    spriteRenderer = GetComponent<SpriteRenderer>();
}

2. 색상 변수 선언하기

  • 픽업 시와 배달 시에 사용할 색상을 변수로 선언합니다.
  • [SerializeField] 어트리뷰트를 사용하여 인스펙터에서 색상을 설정할 수 있도록 합니다.

코드 구현

[SerializeField] Color32 hasPackageColor = new Color32(0, 255, 0, 255); // 초록색
[SerializeField] Color32 noPackageColor = new Color32(255, 255, 255, 255); // 흰색
  • Color32는 RGBA 값을 0~255 범위로 설정할 수 있는 색상 타입입니다.
  • hasPackageColor: 물품을 가지고 있을 때의 차량 색상 (초록색으로 설정).
  • noPackageColor: 물품이 없을 때의 차량 색상 (흰색으로 설정).

3. 색상 변경 로직 추가하기

물품을 픽업할 때

  • OnTriggerEnter2D 메서드에서 물품과 충돌했을 때 색상을 변경합니다.
if (other.tag == "Package")
{
    if (!hasPackage)
    {
        hasPackage = true;
        Debug.Log("물품이 픽업되었습니다.");
        spriteRenderer.color = hasPackageColor; // 차량 색상을 초록색으로 변경
    }
    else
    {
        Debug.Log("이미 물품을 가지고 있습니다.");
    }
}

물품을 배달할 때

  • 고객과 충돌했을 때 물품을 배달하고 차량 색상을 원래대로 돌립니다.
else if (other.tag == "Customer")
{
    if (hasPackage)
    {
        hasPackage = false;
        Debug.Log("물품이 배달되었습니다.");
        spriteRenderer.color = noPackageColor; // 차량 색상을 원래 색으로 변경
    }
    else
    {
        Debug.Log("물품이 없습니다. 배달할 수 없습니다.");
    }
}

4. 전체 코드 확인하기

아래는 모든 변경 사항을 반영한 전체 코드입니다.

using UnityEngine;

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

    // 색상 변수 선언 (인스펙터에서 설정 가능)
    [SerializeField] Color32 hasPackageColor = new Color32(0, 255, 0, 255); // 초록색
    [SerializeField] Color32 noPackageColor = new Color32(255, 255, 255, 255); // 흰색

    // 스프라이트 렌더러 변수 선언
    SpriteRenderer spriteRenderer;

    void Start()
    {
        // 스프라이트 렌더러 컴포넌트를 가져옵니다.
        spriteRenderer = GetComponent<SpriteRenderer>();
        // 게임 시작 시 차량의 색상을 설정합니다.
        spriteRenderer.color = noPackageColor;
        Debug.Log("초기 hasPackage 값: " + hasPackage);
    }

    void OnTriggerEnter2D(Collider2D other)
    {
        if (other.tag == "Package")
        {
            if (!hasPackage)
            {
                hasPackage = true;
                Debug.Log("물품이 픽업되었습니다.");
                // 차량 색상을 물품이 있을 때의 색상으로 변경
                spriteRenderer.color = hasPackageColor;
                // 물품 오브젝트를 제거 (필요하다면)
                Destroy(other.gameObject);
            }
            else
            {
                Debug.Log("이미 물품을 가지고 있습니다.");
            }
        }
        else if (other.tag == "Customer")
        {
            if (hasPackage)
            {
                hasPackage = false;
                Debug.Log("물품이 배달되었습니다.");
                // 차량 색상을 물품이 없을 때의 색상으로 변경
                spriteRenderer.color = noPackageColor;
            }
            else
            {
                Debug.Log("물품이 없습니다. 배달할 수 없습니다.");
            }
        }
    }
}

추가 설명

왜 Sprite Renderer를 사용하는가?

  • 차량의 스프라이트 이미지의 색상을 동적으로 변경하기 위해서입니다.
  • 스프라이트 렌더러의 color 속성을 변경하면 스프라이트의 색상이 변경됩니다.

Color32와 Color의 차이

  • Color32: RGBA 값을 0~255 범위로 설정.
  • Color: RGBA 값을 0~1 범위로 설정.
  • 이 예제에서는 0~255 범위를 사용하는 Color32를 사용하여 직관적으로 색상을 설정했습니다.

알파 값(투명도)에 주의하기

  • 알파 값이 0이면 완전히 투명해져서 스프라이트가 보이지 않습니다.
  • 따라서 알파 값을 255로 설정하여 완전히 불투명하게 만듭니다.

인스펙터에서 색상 변경하기

  • [SerializeField]를 사용하여 인스펙터에서 색상을 직접 설정할 수 있습니다.
  • Unity 에디터에서 원하는 색상을 선택하여 적용할 수 있습니다.

마무리

이렇게 해서 플레이어가 물품을 픽업하고 배달할 때 차량의 색상을 변경하여 시각적인 피드백을 주는 방법을 알아보았습니다. 이 방법을 활용하면 게임의 재미와 직관성을 높일 수 있습니다.


전체 실습 코드

using UnityEngine;

public class Delivery : MonoBehaviour
{
    // 물품 소지 여부
    bool hasPackage = false;

    // 물품 소지 시와 비소지 시의 차량 색상
    [SerializeField] Color32 hasPackageColor = new Color32(0, 255, 0, 255); // 초록색
    [SerializeField] Color32 noPackageColor = new Color32(255, 255, 255, 255); // 흰색

    // 스프라이트 렌더러 컴포넌트
    SpriteRenderer spriteRenderer;

    void Start()
    {
        // 스프라이트 렌더러 컴포넌트를 가져옵니다.
        spriteRenderer = GetComponent<SpriteRenderer>();
        // 초기 차량 색상을 설정합니다.
        spriteRenderer.color = noPackageColor;
        Debug.Log("초기 hasPackage 값: " + hasPackage);
    }

    void OnTriggerEnter2D(Collider2D other)
    {
        if (other.tag == "Package")
        {
            if (!hasPackage)
            {
                hasPackage = true;
                Debug.Log("물품이 픽업되었습니다.");
                // 차량 색상을 물품 소지 시의 색상으로 변경
                spriteRenderer.color = hasPackageColor;
                // 물품 오브젝트 제거
                Destroy(other.gameObject);
            }
            else
            {
                Debug.Log("이미 물품을 가지고 있습니다.");
            }
        }
        else if (other.tag == "Customer")
        {
            if (hasPackage)
            {
                hasPackage = false;
                Debug.Log("물품이 배달되었습니다.");
                // 차량 색상을 물품 비소지 시의 색상으로 변경
                spriteRenderer.color = noPackageColor;
            }
            else
            {
                Debug.Log("물품이 없습니다. 배달할 수 없습니다.");
            }
        }
    }
}

주의사항:

  • 물품 오브젝트의 태그는 반드시 "Package"로 설정되어 있어야 합니다.
  • 고객 오브젝트의 태그는 반드시 "Customer"로 설정되어 있어야 합니다.
  • 차량 오브젝트에는 Collider2DRigidbody2D 컴포넌트가 있어야 합니다.
  • 물품과 고객 오브젝트에도 Collider2D 컴포넌트가 있어야 합니다.
  • 모든 Collider2D 컴포넌트 중 하나는 반드시 Is Trigger 옵션이 체크되어 있어야 합니다.

테스트 방법

  1. Unity 에디터에서 차량(GameObject)를 선택하고, Delivery 스크립트가 추가되어 있는지 확인합니다.
  2. Delivery 스크립트의 인스펙터에서 Has Package ColorNo Package Color를 원하는 색상으로 설정합니다.
  3. 물품(Package) 오브젝트고객(Customer) 오브젝트의 태그를 올바르게 설정합니다.
  4. 게임을 실행하고 차량을 조작하여 물품을 픽업하고 배달해 봅니다.
  5. 차량의 색상이 의도한 대로 변경되는지 확인합니다.

결론

이번 실습을 통해 Unity에서 스프라이트 렌더러를 활용하여 오브젝트의 색상을 동적으로 변경하는 방법을 배웠습니다. 이 방법은 간단하지만 게임 플레이에 큰 영향을 줄 수 있는 중요한 요소입니다.

profile
IT를 좋아합니다.

0개의 댓글