-
내일배움캠프 53일차 TIL - 최종 프로젝트 기초 개발 2TIL/Unity 2024. 7. 2. 20:58
[한 줄 요약]
기초 개발을 진행하여 아이템 작업을 진행했다.
[학습 내용]
최종 프로젝트 기초 개발
체력 회복 아이템
아이템 구조도
아이템 데이터
아이템의 핵심이 될 아이템 데이터를 생성하였다.
using System; using UnityEngine; [Serializable] public class ItemData { [Header("info")] public string Name; public string Description; public Sprite Icon; [Header("trade")] public int Cost; [Header("Stack")] public bool Stackable; public int MaxStackCount; }
인터페이스 사용
사용 가능한 오브젝트와 거래 가능한 오브젝트에 붙여줄 인터페이스를 작성하고, 아이템 자식 클래스 일부에 붙여주었다.
public interface IUsable { public void Use(); } public interface ITradable { public void Purchase(); public void Sell(); }
회복아이템 기능 구현
아이템들 중 HP 회복 아이템을 우선으로 구현하였다.
아이템 슬롯
아이템 슬롯 제작
아이템 데이터를 담을 슬롯을 만들고, 아이템을 추가할 때와 제거할 때의 메소드를 구현해주었다.
public void SetItem() { icon.gameObject.SetActive(true); icon.sprite = ItemData.Icon; countText.text = Count > 1 ? Count.ToString() : string.Empty; if (IsSelected) outline.enabled = true; else outline.enabled = false; } public void ClearItem() { ItemData = null; icon.gameObject.SetActive(false); countText.text = string.Empty; IsSelected = false; outline.enabled = false; }
슬롯을 만들고 바로 인벤토리를 제작했다.
인벤토리
인벤토리 UI
Grid Layout Group을 이용하여 슬롯을 정렬해주고, 우선 아이템 퀵슬롯 버튼을 만들어주었다.
기능 구현
우선 아이템을 추가하는 기능을 넣었다. 그러기 위해서 중복 가능한 아이템인지 먼저 검사하고, 아니라면 빈 슬롯을 찾아 아이템을 추가하도록 구현하였다.
그 다음으로는 UI를 업데이트 시켜주는 메서드를 구현하였다. 내용이 바뀔 때마다 해당 메서드를 호출해주어 항상 최신의 상태를 유지하도록 하였다.
다음으로는 인벤토리에서 아이템을 마우스로 선택할 수 있도록 구현하였다. 선택된 슬롯은 Outline을 활성화해줘서 다른 것과 구별되게 하였다.
아직 구현되지 않은 사항으로는 아이템을 사용하는 것과, 아이템을 추가하는 경로이다.
!! 문제 발생 !!
* 내용
슬롯에 들어있는 ItemData가 있는지 검사하여, 없을 시 빈 슬롯으로 판단하기 위하여 null 검사를 진행하였다. 그런데 당연히 null이어야 ItemData가 null이 아니라고 출력되었다.
클릭 시 빈 슬롯이면 Outline이 활성화가 되지 않아야 하는데, 이 때문에 빈 슬롯에도 활성화가 되는 현상이 발생했다.
* 탐색
ItemData가 혹시 어디에서 할당되었나 계속 찾아보았다. 그런데 찾지 못했다. 지푸라기라도 잡는 심정으로 [Serializable] 어트리뷰트를 제거해보자, 이번에는 정상작동 되었다. 문제의 출발점은 찾았는데, 이유를 아무리 생각해도 알아내지 못하였다. 그래서 튜터님께 들고 갔다.
using System; using UnityEngine; [Serializable] // 문제의 Serializable public class ItemData { [Header("info")] public string Name; public string Description; public Sprite Icon; [Header("trade")] public int Cost; [Header("Stack")] public bool Stackable; public int MaxStackCount; }
* 해결
튜터님에 의하면, Serializable을 통해 인스펙터 창에 보이게 되면서 객체가 할당된 것이라고 한다. 인스펙터 창에 일단 보인다는 것은 유니티에서 자동으로 할당을 해주었기 때문이라고 한다. 그래서 해당 어트리뷰트를 없애면 해결할 수 있다고 말씀해주셨다.
그런데 추후 저장 기능 등에서 사용하기 위해서 직렬화를 해준 것이라, 없애고 싶지 않았다. 그래서 이를 해결하기 위한 방법을 또 여쭤보니, 사용하는 쪽에서 [NonSerialized] 필드를 붙여주면 된다고 해주셨다.
public class ItemSlot : Slot { [NonSerialized] public ItemData ItemData; public Inventory Inventory; ... }
이런 식으로 진행하였더니 문제가 해결되었다.
[회고]
일단 프로젝트는 순항 중인 거 같다. 속도가 잘 나는지까지는 잘 모르겠다. 오늘은 우선 고양이 부분을 제쳐두고 아이템과 인벤토리 부분을 진행했다. 로드맵 상으로 뒤에 있어야 하는 부분이지만, 다른 부분을 건들기는 힘들어보였다. 그래서 일단 진행을 했다.
내일 인벤토리를 이어서 진행해보고 나서, 고양이 전투 등을 만들 생각을 해봐야겠다. 다른 팀원의 기능들과 연결하는 작업도 중요하기 때문에 욕심을 덜어내야 할 거 같다.
'TIL > Unity' 카테고리의 다른 글
내일배움캠프 55일차 TIL - 최종 프로젝트 기초 개발 4 (0) 2024.07.04 내일배움캠프 54일차 TIL - 최종 프로젝트 기초 개발 3 (0) 2024.07.03 내일배움캠프 52일차 TIL - 최종 프로젝트 기초 개발 1 (0) 2024.07.01 내일배움캠프 51일차 TIL - 최종 프로젝트 기획 2 (0) 2024.06.28 내일배움캠프 50일차 TIL - 최종 프로젝트 기획 1 (0) 2024.06.27