-
스파르타3D서바이벌게임 / ItemSlot 만들기 / 유니티숙련주차게임 개발기록 2024. 6. 4. 13:43
인벤토리를 만들기에 앞서 인벤토리에 표시 할 아이템슬롯 오브젝트를 만들어 주자. 이 아이템 슬롯을 여러 개 만들고 아이템을 줍게 되면 아이템 슬롯에 해당 데이터들이 저장 되게 하고 표시 되게 해주자.
이 아이템 슬롯은 UI로써 이미지를 통해서 만들어주고 Icon과 몇 개를 가지고 있는지 글자도 보이게 만들어 주자.
이런 느낌에 아이템 슬롯을 만들어 준다.
그리고 이제 이 아이템 슬롯이 내가 주운 아이템을 표시하게 Script를 작성 해주면 된다. 그 전에 Inventory 화면을 다 만들어 두고 Script를 작성 하자.
이렇게 인벤토리 뒷면을 만들어 준다. 그리고 저 빈 공간에 아이템 슬롯을 미리 만들어 두면 된다. 이 때 빈 객체를 하나 생성 하고 저 빈공간에 알맞은 사이즈를 맞춘 후에 grid layout group 컴포넌트를 추가 시켜준 다음에 아이템 슬롯의 size 만큼 cell size를 맞춰서 이 빈 객체에 아이템슬롯을 추가 시켜주면 자동으로 정렬을 시켜줄 수가 있다.
이렇게 인벤토리창을 만들어 준다.
이 때 아이템 슬롯과 인벤토리 뒷면을 따로 나눈 이유가 있다.
그것 또한 관리하기 쉽게 하기 위함이라고 할 수 있는데, 아이템 슬롯은 주운 아이템의 정보를 등록 하고, 인벤토리에 있는 설명과 사용, 해제, 버리기 버튼은 주운 아이템을 선택 후에 사용 하는 것이다.
뭔가 느낌이 다른 것을 알 수가 있을 것이다.
아무튼 그래서 우리는 아이템슬롯과, 인벤토리를 구분 지어서, 아이템 슬롯은 아이템을 주웠을 때의 정보가 등록이 되어서 icon과 수량이 나타나게 할 것이고, 주운 아이템의 data를 가지게 할 것이다.
그리고 인벤토리에서 아이템 슬롯을 선택 할 경우에 선택한 아이템슬롯에 있는 아이템에 data를 가져와서 사용이나, 해제, 버리기 등을 할 수 있게 만들 것이다. 그리고 버릴 경우에는 아이템 슬롯이 다시 비어지게 한다.
먼저 ItemSlot 클래스를 만들어 보자.
아이템 슬롯은 아이템의 데이터를 갖고 있어야 한다. 그래야 슬롯을 눌렀을 때 데이터를 넘겨줄 수가 있다.
public ItemData item;
코드를 작성 해줘서 아이템 데이터를 가질 수 있게 해준다. 이 데이터는 나중에 AddItem이라는 함수를 통해서 초기화를 하게 해줄 것이다. 나중에 설명 하겠다.
그리고 icon과 button이 있어야 하기에 그것도 만들어 준다. 그리고 자막도, 그리고 우린 장착 된 아이템에 OutLine이라는 컴포넌트가 나오게 할 것이다. (테두리에 다른 색 나오게 지정 가능) 이것까지 만들어 준다.
public Button button;
public Image icon;
public TextMeshProUGUI quantityText;
private Outline outline;그리고 우리는 나중에 Inventory에 있는 함수를 호출 할 것이기에 인벤토리도 만들어 준다.
public UIInventory inventory;
이 변수는 나중에 UIInventory에서 초기화를 해줄 것이다. this를 통해서, 나중에 UIInventory에서 start 할 때 아이템 슬롯들의 정보를 업데이트 할 것이고 그 때 아이템들의 this를 통해서 값도 초기화 하게 할 것이다.
그 이유는 ItemSlot들을 호출 하는 것을 UIInventory 하나로 관리 하기 위함이라고 할 수 있다. 인벤토리에서 아이템슬롯들을 초기화 해주고, 내가 원하는 인덱스에 맞는 아이템슬롯에 함수들을 호출 시키는 것이다.
그리고
public int index;
public bool equipped;
public int quantity;도 만들어 줘서 나중에 활용 할 수 있게 한다. index는 배열 접근 할 때 활용, quantity는 아이템의 수량이다.
먼저 아이템슬롯의 아이템 데이터가 들어왔다면 그걸 표시하는 함수를 만들어 주자.
public void Set()
{
icon.gameObject.SetActive(true);
icon.sprite = item.icon;
quantityText.text = quantity > 1 ? quantity.ToString() : string.Empty;
if (outline != null)
{
outline.enabled = equipped;
}
}이렇게 만들어 줄 것인데, 보면 item에 값이 있어야 정상 작동 하는 것을 볼 수가 있다. 이 item에 값을 넣는 방법에는 여러가지가 있다. 우린 interaction을 통해 직접 이 아이템에 값을 넣어줄 수가 있지만 이번엔 그러지 않고, UIInventory를 이용해서 이 ItemSlot에 있는 item에 값을 넣어 줄 것이다.
Interaction을 사용하여 아이템을 상호작용키를 눌렀다면, 인베토리에 아이템을 추가 하는 함수가 실행이 되고, 그 함수는 빈 슬롯을 찾고, 빈 슬롯에다가 상호작용한 아이템을 집어 넣는다. 집어 넣는 방법은 그 빈슬롯인 아이템슬롯에 선택 한 아이템 Data가 들어가게 하고, 이 Set 함수를 작동 하게 하는 것이다. 나중에 다시 설명 하겠다.
그리고 아이템을 버렸을 때 등록 돼있는 ItemData를 지우게 할 함수도 만들어 준다. \
public void Clear()
{
item = null;
icon.gameObject.SetActive(false);
quantityText.text = string.Empty;
}이렇게 하면 item에 들어있는 data를 없애고 자막과 아이콘도 비어두게 한다.
그리고 이 아이템슬롯에 버튼을 등록 해뒀는데, 이 아이템슬롯을 누르면 실행 되게 하는 함수도 만들어 준다.
public void OnClickButton()
{
inventory.SelectItem(index);
}라는 코드를 작성해서 inventory에 있는 SelectItem를 호출 하게 해준다. 왜 inventory에 있는 함수냐.
선택 된 아이템의 정보가 나오게 하고, 그 아이템을 사용 및 버리기 등을 사용 하는 버튼은 inventory가 있다. 아까 말 했듯 이 아이템 슬롯은 선택 하고 주운 아이템의 data를 저장 할 클래스라고 생각 하면 좋다.
그리고 마지막으로 아이템슬롯의 OutLine을 만들어 주는 코드만 작성을 해준다.
private void Awake()
{
outline = GetComponent<Outline>();
}
private void OnEnable()
{
outline.enabled = equipped;
}OnEnable은 equipped의 값에 따라 outline 활성화를 하고 안하고를 해줄 수 있게 하는 것이다. 나중에 자세히 설명.
지금은 equipped(장착여부)가 true라면 outline이 활성화 된다.
이제 이 ItemSlot들을 갖고 있는 UIInventory 클래스를 만들어서 인벤토리 기능을 구현 해보도록 하자.
UIInvetory 오브젝트가 여러 버튼들을 관리 하는 것처럼 여러 아이템슬롯도 관리 할 수 있게 만드는 것이다. 그러기 위해서 ItemSlot의 객체를 UIInventory에서 생성을 하는 것이다.
'게임 개발기록' 카테고리의 다른 글
스파르타3D서바이벌/아이템사용기능/유니티숙련주차 (0) 2024.06.04 스파르타3D서바이벌게임/Inventory만들기/유니티 숙련주차 (0) 2024.06.04 스파르타 3D 서바이벌게임 / 상호작용기능 만들기 / 유니티 숙련주차 (1) 2024.06.04 스파르타 3D 서바이벌 게임 / 아이템 만들기 / 유니티 숙련주차 (1) 2024.06.04 스파르타 부트캠프 게임개발입문주차 개인과제 (0) 2024.05.26