
UI MyDocument

UI MyDocument의 역할
- ItemManager에서 Player가 가지고 있는 아이템 리스트를 시각적으로 생성하여 보여준다.
- 특정 아이템을 클릭했을 때 아이템 정보를 보여준다.
- 아이템을 드래그 앤 드롭으로 버린다.
- 사용하고 있는 저장 공간을 텍스트+시각화해서 보여준다.
- 저장 공간은 아이템을 버리면 최신화된다.
필요한 변수들 선언
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class UI_3_MyDocument : MonoBehaviour
{
private static UI_3_MyDocument instance = null;
// UI Window
public GameObject UI_W_MyDocument = null;
// Item Drag Area
public GameObject WindowUI;
// Detail
public GameObject Button_Item_Prefab;
public GameObject i_Item_Detail_Image_Prefab;
public Text t_Item_Detail_Name_Prefab;
public Text t_Item_Detail_Explanation_Prefab;
public Text t_Item_Detail_Size_Prefab;
public Image i_StorageView;
public Text t_StorageRate;
public Transform ContentItemGroup;
// Manager
private ItemManager itemManager = null;
private StatusManager statusManager = null;
public static UI_3_MyDocument Instance
{
get
{
if (instance == null)
{
instance = FindObjectOfType<UI_3_MyDocument>();
if (instance == null)
{
GameObject singletonObject = new GameObject(typeof(UI_3_MyDocument).Name);
instance = singletonObject.AddComponent<UI_3_MyDocument>();
DontDestroyOnLoad(singletonObject);
}
}
return instance;
}
}
...
}
중요한 역할을 하는 변수들은 다음과 같다.
- instance
- UI_3_MyDocument 클래스의 싱글톤 인스턴스를 저장하고 관리하며, 전역적으로 접근 가능한 정적 변수
기본 함수(Awake, Start, Update)
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class UI_3_MyDocument : MonoBehaviour
{
...
private void Awake()
{
if (instance == null)
{
instance = this;
DontDestroyOnLoad(this.gameObject);
}
else if (instance != this)
{
Destroy(gameObject);
}
}
// Start is called before the first frame update
void Start()
{
itemManager = ItemManager.Instance;
statusManager = StatusManager.Instance;
}
// Update is called once per frame
void Update()
{
}
...
}
Awake()
싱글톤 인스턴스 설정과 씬 전환 시 객체를 유지하게 만들고, 현재 오브젝트가 기존 인스턴스와 다른 경우 파괴하도록 만들어줬다.
Start()
ItemManager에서 ItemList를, StatusManager에서 저장 공간과 관련된 데이터를 읽어와야 하므로 인스턴스를 통해 접근할 수 있도록 초기화했다.
UI Active 관련 함수
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class UI_3_MyDocument : MonoBehaviour
{
...
public void OpenUI()
{
if (UI_W_MyDocument != null)
{
GenerateItemList();
UI_W_MyDocument.SetActive(true);
}
}
public void CloseUI()
{
if (UI_W_MyDocument != null)
{
UI_W_MyDocument.SetActive(false);
}
}
...
}
UI 매니저에서 각각의 UI 요소들의 Active 상태를 제어하는 OpenUI, CloseUI 함수를 정의해 유지보수성을 높였다.
상태 변화를 제어하는 것을 이 함수들을 사용하는 것으로 한정해 불필요한 활성화/비활성화로 부작용을 방지하도록 만들었다.
UI Open시 ItemList를 먼저 생성시키도록 구현했다.
GenerateItemList 함수
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class UI_3_MyDocument : MonoBehaviour
{
...
public void GenerateItemList()
{
foreach (Transform child in ContentItemGroup)
{
Destroy(child.gameObject);
}
foreach (var kvp in itemManager.itemList)
{
string itemName = kvp.Key;
List<Item> items = kvp.Value;
foreach (Item itemInfo in items)
{
GameObject newButton = Instantiate(Button_Item_Prefab, ContentItemGroup);
ItemDragHandler dragHandler = newButton.AddComponent<ItemDragHandler>(); // ItemDragHandler 추가
dragHandler.item = itemInfo; // 아이템 정보 전달
dragHandler.windowUI = WindowUI; // WindowUI 오브젝트 참조 전달
Transform childImageTransform = newButton.transform.Find("Image");
Transform childTextTransform = newButton.transform.Find("Text");
if (childImageTransform != null)
{
Image ButtonImage = childImageTransform.GetComponent<Image>();
Text ButtonText = childTextTransform.GetComponent<Text>();
if (ButtonImage != null)
{
SetItemImage(ButtonImage, itemInfo.itemType);
ButtonText.text = itemInfo.ItemName;
newButton.GetComponent<Button>().onClick.AddListener(() => OpenItemDetail(itemInfo));
}
else
{
Debug.LogError("Error: Button image not found.");
}
}
else
{
Debug.LogError("자식 오브젝트를 찾을 수 없습니다.");
}
}
}
}
public void SetItemImage(Image buttonImage, Item.ItemType itemType)
{
string spriteSheetName = "";
Sprite[] sprites;
Sprite itemSprite = null;
int ImageIndex = Item.ImageNumber[(int)itemType];
// 이미지 설정
// 아이템 타입에 따른 이미지 경로 설정
switch (itemType)
{
case Item.ItemType.Coin1:
case Item.ItemType.Coin5:
case Item.ItemType.Coin10:
case Item.ItemType.Coin15:
spriteSheetName = "Item/use_Coin";
break;
case Item.ItemType.Key:
case Item.ItemType.CardPack:
case Item.ItemType.ProgramRemove:
case Item.ItemType.ProgramRecycle:
spriteSheetName = "Item/use_DropItem";
break;
/* 힐 아이템 추가할 것
// case Item.ItemType.Heal:
// case Item.ItemType.TemHp:
// case Item.ItemType.Shiled:
// case Item.ItemType.Spark:
// spriteSheetName = "Sprites/Items/Heal";
sprites = Resources.LoadAll<Sprite>(spriteSheetName);
itemSprite = sprites[ImageIndex];
// break;
*/
default:
Debug.LogError("Unknown item type.");
return;
}
sprites = Resources.LoadAll<Sprite>(spriteSheetName);
itemSprite = sprites[ImageIndex];
if (itemSprite != null)
{
buttonImage.sprite = itemSprite;
Debug.Log($"Item Image loaded: {itemType} -> {itemSprite.name}");
}
else
{
Debug.LogError($"Sprite not found for item type: {itemType} at path: {spriteSheetName}");
}
}
...
}
GenerateItemList()
아이템 버튼들을 생성하고, 드래그 앤 드롭으로 아이템을 버릴 수 있도록 Handler를 할당한다.
SetItemImage()
아이템의 타입과 인덱스를 이용해 이미지를 설정해 준다. 이후에 추가될 아이템을 주석 처리 해놨다(현재는 미구현)
Detail Section함수들
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class UI_3_MyDocument : MonoBehaviour
{
...
public void OpenItemDetail(Item CurItem)
{
Image DetailImage = i_Item_Detail_Image_Prefab.GetComponent<Image>();
SetItemImage(DetailImage, CurItem.itemType);
t_Item_Detail_Name_Prefab.text = CurItem.ItemName;
t_Item_Detail_Explanation_Prefab.text = CurItem.ItemInfomation;
t_Item_Detail_Size_Prefab.text = CurItem.ItemSize.ToString() + "MB";
}
public void RemoveItemDetail()
{
Image DetailImage = i_Item_Detail_Image_Prefab.GetComponent<Image>();
DetailImage.sprite = null;
t_Item_Detail_Name_Prefab.text = "";
t_Item_Detail_Explanation_Prefab.text = "";
t_Item_Detail_Size_Prefab.text = "";
}
...
}
각각의 요소들을 클릭된 아이템에 정보로 연결하고, 정보와 이미지를 삭제하는 함수이다.
Storage Update 함수
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class UI_3_MyDocument : MonoBehaviour
{
...
public void UpdateStorage()
{
i_StorageView.fillAmount = (float)statusManager.CurrentStorage / (statusManager.B_MaxStorage);
t_StorageRate.text = statusManager.MaxStorage.ToString() + "MB 중 " + (statusManager.MaxStorage - statusManager.CurrentStorage).ToString() + "MB 사용 가능";
}
...
}
Detail 정보 하단에 현재 용량의 사용 퍼센티지를 이미지와 텍스트로 표시하는데, 이 항목들을 업데이트해 주는 함수이다.
참고 사항
UI Manager
[Unity] UI Manager 구현
UI ManagerUI Manager 기본정보큰 UI의 틀이 있고 버튼을 통해 총 7개의 화면 전환이 있어야 한다.기본 정보를 보여주는 UI게임 기능인 프로그램의 정보를 띄워주는 UI인벤토리처럼 획득한 아이템 리스
gdoo.tistory.com
DragHandler
추가 예정
마무리하며..
이후에 추가될 것들이 가장 많은 곳이다.
또한, 리소스폴더에서 이미지를 불러 띄우는 것이 코스트가 크다는 것을 알게 되어서 추후 수정할 예정이다.
'Unity > Hackers Window' 카테고리의 다른 글
[Unity] UI 5, 7 - NetWork, Help (1) | 2024.11.24 |
---|---|
[Unity] UI 6 : Control(환경설정 UI) (1) | 2024.11.23 |
[Unity] UI 3 : DownLoad (0) | 2024.11.21 |
[Unity] UI 2 : MyPC(Status UI) (0) | 2024.11.20 |
[Unity] UI 1 : HUD (0) | 2024.11.19 |