아직 테스트 해보진 못했는데 인벤토리를 Queue로 관리하면 좀 편리할 것 같아서 코드를 짰다.
using System;
using System.Collections.Generic;
using System.Linq;
using Unity.VisualScripting;
using Unity.VisualScripting.Antlr3.Runtime.Misc;
using UnityEngine;
using UnityEngine.UI;
public class Inventory : MonoBehaviour
{
public Dictionary<string, Queue<Slot>> SlotByEquipPlace;
private void Awake()
{
SlotByEquipPlace = new Dictionary<string, Queue<Slot>>();
Slot[] slots = GetComponentsInChildren<Slot>();
for (int i = 0; i < 4; i++)
{
Queue<Slot> Slots = new Queue<Slot>();
string tag = ((EquipSlot)i).ToString();
for (int j = 0; j < slots.Length; j++)
{
Slots.Enqueue(slots[j]);
}
SlotByEquipPlace.Add(tag, Slots);
}
ItemManager.Instance.Inventory = this;
}
public Item GetItem(string tag, string name)
{
Item item = new Item();
//인벤토리 내부의 tag에 맞는 아이템 슬롯을 호출 > 슬롯 내부의 아이템을 가져옴
if(SlotByEquipPlace[tag] != null)
{
Slot slot = SlotByEquipPlace[tag].First(slot => slot.Item.Data.Name == name);
item = slot.Item;
}
return item;
}
public void SetItem(Item item)
{
string tag = item.Data.EquipSlot.ToString();
if (SlotByEquipPlace[tag].GroupBy(slot => slot.Item == null).Any(group => group.Count() > 0))
{
SlotByEquipPlace[tag].First(slot => slot == null).Item = item;
}
else
{
Debug.Log("인벤토리가 꽉 찼습니다.");
}
}
public void RemoveItem(Item item)
{
SlotByEquipPlace[item.Data.EquipSlot.ToString()].First(slot => slot.Item == item).Item = null;
}
}
enum EquipSlot에는 헬멧, 갑옷, 무기, 신발 종류가 있고
그 슬롯마다 각각의 Queue<Slot>을 생성하고 슬롯 내부의 아이템 정보를 교환하는 방식으로 생성했다.
아직 테스트 전이라 정상 작동하는지는 미지수이다.
그리고 맵 매니저를 통해 같은 청크를 무한 생성하게끔 만들었는데
public class MapManager : Singleton<MapManager>
{
public Queue<GameObject> Chunks;
public GameObject block;
public Transform parent;
public Transform Party;
private Vector3 _nextChunkPosition;
public int Stage;
public int size;
private void Awake()
{
_nextChunkPosition = new Vector3(0, -1, 0);
Chunks = new Queue<GameObject>();
for (int i = 0; i < size; i++)
{
GameObject obj = Instantiate(block, parent);
Chunks.Enqueue(obj);
obj.SetActive(false);
}
}
private void Update()
{
if (Party.position.z > _nextChunkPosition.z - 60f)
{
MakeChunk();
}
}
private void MakeChunk()
{
GameObject obj = Chunks.Dequeue();
obj.transform.position = _nextChunkPosition;
_nextChunkPosition.z += 6f;
obj.SetActive(true);
Chunks.Enqueue(obj);
}
}
오브젝트 풀링 기법을 이용해서 정해진 수 만큼의 청크를 생성하고
진행 방향으로 전진하면 맨 뒤의 블럭을 지우고 다시 생성하는 과정이다.
동작 자체는 정상적으로 작동한다.
근데 청크가 하나 뿐이라 게임 화면으로 보면 그냥 캐릭터 애니메이션만 실행되는 듯한 효과가 있다.
괜찮은 에셋을 발견하면 교체할 예정이다. 없으면 어쩔 수 없고
1119 TIL - 플랫포머 플레이어 이동 2 (0) | 2024.11.19 |
---|---|
1118 TIL - 플랫포머 2D 캐릭터 이동하기 (0) | 2024.11.18 |
1107 TIL - 팀 프로젝트 완료 (0) | 2024.11.07 |
1030 TIL - C# 제네릭 싱글톤 (0) | 2024.10.30 |
1025 TIL - 오브젝트 풀을 활용한 효과음 구현 (1) | 2024.10.25 |