[유니티] Unity 2D 아이템 습득 및 구현 ITEM

2D 유니티로 만드는 게임의 인벤토리 및 아이템 습득과 사용

 

제가 프로젝트로 2D 게임을 만들고 있는데, 그 중에 저는 UI담당과 아이템을 맡아서 하고 있습니다. 그 외에도 더 많지만 아무튼 이번엔 아이템에 관련한 구현방법을 알려드리려 합니다.

 

이걸 구현하려고 구글에 이것저것 검색해보고 유튜브에도 검색해보며 찾아봤지만 저같은 초보개발자들이 처음으로 이걸 하려하니 어떻게 해야할지 봐도 모르겠더라구요 그래서 초보개발자인 제가 간단한 방식의 아이템 습득과 인벤토리를 구현한 글을 쓰려합니다.

 

우선 아이템오브젝트 구현과 습득먼저 쓰고 차근차근 알려드리겠습니다. 

 

1. 아이템 오브젝트를 만들어보자

제가 만들고 있는 프로젝트의 모습입니다. 여긴 그냥 테스트용 씬이라 괜..찮...을겁니다.. ㅇㅅㅇ

우선 에셋이 있다면 해당 에셋을 Scene에 끌어옵니다. 그럼 알아서 자동으로 오브젝트가 생성됩니다.

 

그럼 해당 오브젝트의 Inspector에 Sprite Renderer까지는 들어가 있었을 겁니다.

이제 저희는 Add Component로 Box Collider 2D와 해당 오브젝트를 다룰 스크립트를 추가해줍시다.

아, 추가한 Box Collider 2D에 is Tirgger를 체크해줍시다.

isTrigger는 해당 오브젝트와의 충돌과 관련된 것인데, 체크가 안되어있으면 오브젝트끼리 충돌되어 통과가 안되고 체크하면 통과는 되지만 충돌판별이 되는 것입니다.

 

그럼 이제 아이템 오브젝트의 외적은 끝입니다. 이제 아이템 스크립트를 다루러 가보겠습니다.

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public abstract class Item : MonoBehaviour
{
    public int item_number; //아이템 번호
    public string item_Name; //아이템이름
    public Sprite item_sprite; //아이템 이미지
    public int max_count; //최대 소지갯수
    public int now_Count; //현재 소지갯수


    public bool isGet = false; //얻었는지 확인하는 변수
    
    public abstract void Use_Effect(); //사용효과 추상메소드

    private void OnTriggerEnter2D(Collider2D collision) //아이템과 충돌시 발동
    {
        if (collision.CompareTag("Player") && !isGet)
        {
            isGet = true; // 아이템이 습득되었다고 표시
            bool wasAdded = GetItem(collision); //아이템 습득 함수

            // 아이템을 성공적으로 추가했다면, 시각적으로 아이템을 숨깁니다.
            if (wasAdded)
            {
                HideItem(); // 시각적으로 아이템 숨기기
            }
            else
            {
                // 아이템을 추가하지 못했다면, isGet을 다시 false로 설정합니다.
                isGet = false;
            }
        }
    }

    private void HideItem() //아이템 씬에서 숨기기
    {
        // 예: 렌더러를 비활성화하거나, 아이템을 카메라에서 멀리 이동시키는 등
        Renderer renderer = GetComponent<Renderer>();
        if (renderer != null)
        {
            renderer.enabled = false;
        }
    }

    private bool GetItem(Collider2D player)
    {
       //아이템 습득 코드 작성
       return true;
    }

}

 

제가 만들고 있는 프로젝트의 최~~소한의 코드를 가져와봤습니다. 

아이템의 키값인 번호와 아이템의 이름, 아이템의 이미지와 소지갯수와 최대로 가질 수 있는 갯수, 마지막으로 해당 아이템을 습득한 상태인지 확인하는 bool형 변수까지 넣어주었습니다.

 

Use_Effect함수

abstract로 선언한 Use_Effect()함수는 해당 아이템 사용시 효과를 나타낼 함수입니다.

 

OnTriggerEnter2D(Collider2D collision)함수

유니티 자체에서 제공해주는 함수로 아까 Box Collider로 넣은 오브젝트의 충돌감지시 발생하는 함수입니다.

해당 오브젝트가 어느것과 충돌시 이 함수를 통해 발생시킵니다.

지금 코드에는 Tag가 Player인 오브젝트와 충돌하고 습득하지 않은 아이템일경우 습득되도록 구현되있습니다.

 

HideItem() 함수

아이템 습득 시 그자리의 아이템을 숨기는 함수입니다. 아이템을 먹었는데 그자리에 아이템이 가만히 있으면 안되니까 숨기기를 통해 먹어서 사라진 것 처럼 보이기 위함입니다.

 

GetItem() 함수

아이템 습득의 로직을 위한 함수입니다. 이곳에서 아이템을 먹으면 인벤토리로 옮기도록 구현합니다.

 

2. 바나나 스크립트 완성

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Banana : Item
{
    public override void DestroyAfterTime()
    {
        
    }

    private void Awake()
    {
        item_type = Item_Type.Potion_Parts;
        item_Name = "Banana";
        item_number = 1;
    }

    public override void Use_Effect()
    {
        Debug.Log("바나나 사용");
    }

}

아까 만든 Item 스크립트를 상속 받습니다.

저 DestroyAfterTime()함수는 무시하세요. 제 프로젝트의 스크립트를 참고해서 만드느라 딸려온거라..

상속받은 스크립트에서 초기화는 Awake에서 해야합니다. 아니면 오류납니다.

Item_type도 제 프로젝트 코드를 가져온거라 이렇게 가져온점.. 우선 바나나는 음식이니까 포션류라고만 생각해주세요.

아이템이름은 Banana, 아이템번호는 1로 설정해줍니다.

Use_Effect()에는 아이템 사용 시 일어날 효과를 작성해줍니다. 딱히 할게 없으니 그냥 Debug로만 해주겠습니다.

 

이렇게 하면 아이템의 기본 틀은 완성입니다.

 

다음 글에는 인벤토리와 GetItem함수를 구현해보겠습니다.