유니티 아이템 획득 인벤토리 - yuniti aitem hoegdeug inbentoli

 기능

획득한 아이템을 사용 및 장착 하도록 구현한다.

※ 참고 사항

1. 획득한 아이템들은 인벤토리에서 보여준다.

2. 인벤토리내 아이템을 클릭하면 설명창이 뜬다. 설명창에서 '사용'할지 '제거'할지 판단할 수 있다.

3. 장비아이템의 경우 '사용' 대신 '장착' 문구를 보여준다.

4. 아이템을 장착하면 장착 슬롯의 아이콘을 갱신하며, 인벤토리에서 제거한다.

5. 반대로 해제하면 장착 슬롯을 비워주며, 인벤토리에 추가한다. 

! 주의 사항

아이템 장착 및 해제시 '캐릭터 스텟', '인벤토리', '인벤토리 UI', '장착 아이템 UI'를 갱신한다.

 코드

더보기

아이템 장착시 기존에 장착된 아이템(old)는 인벤토리로, 새롭게 장착할 아이템(new)는 장착 배열에 넣는다.
해당 아이템의 위치를 찾고, 아이템을 인벤토리에 추가한다.
아이템을 장착 및 해제하면 장착 UI도 갱신해야한다.

 구현 영상

 리펙토링

더보기

저작자표시비영리변경금지

'유니티 > 3D RPG' 카테고리의 다른 글

17 퀘스트 시스템  (0) 15 UI 추가/수정  (0) 013 몬스터 DB  (0) 012 아이템 정보 요청/갱신  (0) 011 TCP/IP 환경의 서버 구축  (0)
2020.01.16
2020.01.11
2019.12.30
2019.12.27
2019.12.24

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

public class ItemPickUp : MonoBehaviour {

public int itemID;
public int _count;
//public string pickUpSound;

// Use this for initialization
private void OnTriggerStay2D(Collider2D collision)
{
if (Input.GetKeyDown(KeyCode.Z))
{
Inventory.instance.GetAnItem(itemID, _count);
// AudioManager.instance.Play(pickUpSound);
Destroy(this.gameObject);
}
}

} 다 따라했는데도 불구하고 안먹어지는 이유를 도저히 모르겠습니다.

인벤토리 구현하기

WCTP의 인벤토리는, 무기와 장신구 등 장비를 소지하는 칸과, 소지품이나 퀘스트아이템 등을 소지하는 칸이 나누어져 있습니다. 소지품, 아이템에 관한 기획이 아직 나온게 없기때문에 이번엔 장신구를 획득, 소지, 장착 하는 것을 구현해 보았습니다. ScriptableObject를 이용하여 아이템 정보를 정의할 수 있고, 인벤토리 시스템 내에 Slot을 List로 저장해서 인벤토리 슬롯을 지정합니다. 그리고 Slot에 아이템 정보를 주입해 icon 등을 바꿔줍니다.

인벤토리 UI

인벤토리 UI 기획이 아직 확정이 안되어서 임시로 만들었습니다. Items가 소지중인 아이템이고, EquipedAcc이 착용중인 아이템입니다. 자식으로 Slot들을 가지고 있습니다. 중요한건 인스펙터 뷰에 보이는 Grid Layout Group과 Content Size Filter입니다. 

그룹안에 Slot이 추가되면 알아서 정렬 시켜주고, 창 크기도 맞춰서 키워줍니다.

아이템 소지와 획득

사실 아이템 소지는 따로 하는게 없습니다. 획득이나 삭제를 구현하면 소지는 자연스럽게 되는거죠, 이 때 소지하고 있을때 Slot의 아이콘을 바꿔주게 하는게 다입니다.

사실 Slot은 자식으로 Image를 가지고 있습니다. Slot이 아이템을 얻게되면, 이 오브젝트의 Sprite를 바꿉니다.

Slot.cs

Slot의 AddItem은 InventorySystem이라는 싱글톤 클래스에서 호출합니다.

InventorySystem.cs

이제 저 AddItem()을 게임에 맞게 호출해주면 되겠죠?(퀘스트 보상이라던지, 드랍된 아이템 먹기)

아이템 정의

아이템 오브젝트를 정의하는걸 빼먹었네요, 아이템 오브젝트는 WCTP에서 무기와 장신구같은 경우 기본 스탯, 효과가 있고 획득 시 랜덤으로 추가 효과가 붙습니다. 그래서 기본 데이터는 ScriptableObject로 base를 정의하고, 각각의 아이템은 데이터 base를 참조하게 합니다.

DroppedItemBase.cs 클래스명을 좀 안맞게 지었네요

아이템 착용

Use 명령이 Slot에게 내려지면, Slot은 자신이 가진 아이템에게 Use명령을 내립니다.

Slot.cs
착용 버튼을 눌렀거나 했을 때 Slot에서 호출 하면 될것 같네요.
InventorySystem.cs

아이템 삭제

Slot에게 RemoveItem은 여러곳에서 호출 할 수 있겠네요.(장착, Use or 버리기)

Slot.cs

아이템 드랍

지금까지는 인벤토리와 Slot에서 이루어지는 내용이었습니다. 드랍된 아이템은 UI가 아니라 월드내의 오브젝트로 취급하겠죠.

아까 DroppedItemBase와는 상관 없습니다.

이 DroppedItem을 컴포넌트로 가지는 오브젝트를 프리팹화 시킵니다. 그리고 아이템을 드랍하는 Manager를 만듭니다.

ItemDropSystem.cs

DropItem을 몬스터가 죽을때 자신의 드랍테이블에 맞게 호출해서 Item을 드랍하면 될것 같습니다. 필요에 따라 테이블 자체를 넘기면 알아서 랜덤으로 떨어지게 만들면 될 것 같네요.

장신구 착용까지 현재 구현한 상태입니다. 이제 최초 착용 시 적용효과, 액티브/패시브 효과 등을 어떻게 효율적으로 구현할 지 생각해보도록 하겠습니다.

마무리

앞으로도 일지에는 게임개발 소개와 기능 구현 설명이 같이 들어 갈 수 있습니다.

WCTP에만 특별히 적용되는 무기나 스킬같은건 소개만 하고, 이번과 같이 시스템을 구현할때는 기능 구현 설명도 추가해 다른 프로젝트에 적용 하기 쉽게 하려는 목적입니다.

그리고 피드백도 받을 수 있다면 좋을 것 같습니다.

Toplist

최신 우편물

태그