2023. 12. 14. 22:23ㆍIT/TIL
오늘의 TIL은 개인과제를 진행하면서 공부했던 프리펩과 ItemSlot 에 관한 이야기이다.
개인과제를 스파르타 던전 유니티 버전으로 선정한 후에 작업을 하면서 경험한 내용인데,
프리펩에 스크립트를 연결한 후에, 그 스크립트에 게임 오브젝트 등을 연결하는 경우에,
자신의 하위에 있는 오브젝트들의 경우에는 연결이 가능하나,
자신 밖에 있는 오브젝트들은 기본으로 연결이 불가능하다.
아 이미지의 오른쪽 하단의 Item Button 스크립트를 보면,
Item Icon. Equip 오브젝트 등은 프리펩을 더블 클릭하여 나오는 창에서 수정할 수 있지만,
이 프리펩 외부에 있는 오브젝트 등은 연결이 불가능하다.
위의 이미지처럼 프리펩을 밖(Hierarchy 창)으로 꺼낸 후에 연결할 수 있지만,
이는 Project의 프리펩에는 저장되지 않고 밖으로 꺼낸 Hierarchy 창에 있는 프리펩에만 적용된다.
Project 창의 프리펩에 저장할 수 있는 데이터라면 Overrides에서 Apply All을 통해 저장할 수 있지만,
지금의 정보는 저장할 수 없어서 Apply All 버튼이 활성화되지 않는다.
이 문제로 개인과제를 진행하는데 어려움을 겪었는데,
가장 큰 문제는 해당 프리펩에서 프리펩의 버튼을 눌렀을 때,
외부에 있는 확인용 팝업창이 떠야되는데 뜨지 않는 문제였다.
또, 어떻게 팝업창을 띄운 뒤에는 Yes 버튼을 눌렀을 때,
이 결과물이 이 프리펩 하위에 있는 Equip 게임오브젝트에 영향을 주어야되는데
이 연결이 안되는 문제를 겪었다.
이후에 프리펩에 대해 공부하면서 위의 사실을 정리하였고,
개인과제 해설 강의를 보면서 ItemSlot을 이용하여 이 기능을 구현하였다.
우선 ItemSlot을 이용하면서 스크립터블 오브젝트를 관리하는 스크립터블 오브젝트를 만들었으며,
이 정보를 가지고 ItemPool을 만들어서 이 Pool에 있는 정보로
ItemSlot에 데이터를 전달하도록 만들었다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class UIManager : MonoBehaviour
{
// 인벤토리를 열었을 때, 아이템 슬롯에 아이템 정보들이 들어가야함.
public ItemSlot[] itemslots;
public void SetInventory()
{
for (int i = 0; i < DataManager.instance.itemPool.myItems.Length; i++)
{
itemslots[i].Init(DataManager.instance.itemPool.myItems[i]);
}
for (int i = DataManager.instance.itemPool.myItems.Length; i < 9; i++)
{
itemslots[i].gameObject.SetActive(false);
}
}
}
위와 같이 코드를 작성했으며,
itemPool의 길이에 따라서 itemslots를 만들고, 비어있는 아이템은 버튼이 활성화되지 않게
아래의 for 문으로 게임오브젝트를 비활성화 시켰다.
즉, 프리펩을 이용하여 아이템 수 만큼 프리펩을 생성하려고 하였던 전략에서
미리 아이템 슬롯을 채워놓은 후에 실제로 갖고 있는 아이템 풀만큼 화면에 보이도록 전략을 수정했다.
만약 아이템 수가 9개가 넘어가는 경우에는 for문 안에 for문으로 1번 ~ 9번까지는 1페이지에,
10번 ~ 18번까지는 2페이지에, ... 으로 페이지로 나눠서 표현할 예정이었다.
(해설 강의에서는 페이지로 나눈 것이 아니라 스크롤 방식으로 만들어서, 이 방식도 테스트 해보았다)
이 과제를 진행하면서 실제 개발된 게임들에서는 아이템 창을 어떻게 구현하는지 알아보고 싶은 마음이 생겼다.
추후에 기회가 된다면 이 부분을 확인해보려고 한다.
또, 해설 강의에서 UI와 관련되어 앵커를 설명해주셨는데,
내일은 UI와 관련하여 앵커와 피벗을 공부해볼 예정이다.
'IT > TIL' 카테고리의 다른 글
20231218_OnTrigger,OnCollision (0) | 2023.12.19 |
---|---|
20231215_데이터 저장 (0) | 2023.12.16 |
20231213_Class (0) | 2023.12.14 |
20231212_ScriptableObject (0) | 2023.12.12 |
20231211_SOLID원칙, LayerMask, 싱글톤 (1) | 2023.12.11 |