상세 컨텐츠

본문 제목

1112 TIL - 개인 프로젝트 진행 중

스파르타 코딩캠프/'24 Today I Learned

by lucar 2024. 11. 12. 20:03

본문

아직 테스트 해보진 못했는데 인벤토리를 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);
    }
}

오브젝트 풀링 기법을 이용해서 정해진 수 만큼의 청크를 생성하고

진행 방향으로 전진하면 맨 뒤의 블럭을 지우고 다시 생성하는 과정이다.

 

동작 자체는 정상적으로 작동한다.

근데 청크가 하나 뿐이라 게임 화면으로 보면 그냥 캐릭터 애니메이션만 실행되는 듯한 효과가 있다.

괜찮은 에셋을 발견하면 교체할 예정이다. 없으면 어쩔 수 없고

관련글 더보기