TIL

25.04.23 TIL

gaon99 2025. 4. 23. 22:27

1. 오늘 학습 키워드

엔딩 연결해주기, 상단바 UI제작


2. 오늘 학습 한 내용을 나만의 언어로 정리하기

 

코드로 작성한 부분은 별로 없어서, 쓸 내용이 많지는 않다만

 

우선 Memory로 작성했던 내용을 상단바에 넣을 내용이기에, 코드를 옮겨줬다.

 

오브젝트 하나하나를 관리하는 것보다 큰 UI에 담아서 한번에 관리해주었다.

 

아직 코드적으로 완성이 되진 않았지만, 

덱과 체력 그리고 메모리, 유물까지 관리를 해줄 상단 바이다.

using System.Collections;
using System.Collections.Generic;
using TMPro;
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement.AsyncOperations;
using UnityEngine.UI;

public class UpperBar : MonoBehaviour
{    
    private DataManager DM;

    [Header("HP")]
    private TextMeshProUGUI text;
    [Header("Booty")]private List<Image> Slots = new();
    [Header("Memory")] public GameObject memory;
    [SerializeField] private Transform content;
    private List<GameObject> pool = new ();
    public List<MemorySO> memoryList;
    [Header("Deck")] public List<CardSO> cardList;

    private void Init()
    {
        memoryList = new List<MemorySO>(DM.Memories.Values);
        cardList = new List<CardSO>(DM.cardList);
    } 
    
    void Start()
    {
        DM = Manager.Instance.DataManager;

        Init();
        InitPool();
        InitButton();
        LoadMemoryList();
    }

    private void InitButton()
    {
        Button btn = transform.Find("MemoryBtn")?.GetComponent<Button>();
        Button btn2 = transform.Find("CardBtn")?.GetComponent<Button>();
        
        btn?.onClick.AddListener(LoadMenoryCollection);
        btn2?.onClick.AddListener(LoadDeckCollection);
    }
    public void AddToCollection(MemorySO so)
    {
        DM.Memories.Add(so.Index,so);
    }

    public void InitPool() //초기 풀 생성
    {
        for (int i = 0; i < memoryList.Count; i++)
        {
            GameObject obj = Instantiate(memory, content);
            obj.SetActive(false);
            pool.Add(obj);
        }
    }
    
    public void LoadDeckCollection() //수집품 열기
    {
        ReturnAllPanels();

        foreach (var kvp in DM.Memories)
        {
            var so = kvp.Value;
            var panelObj = GetPanel();
            var ui = panelObj.GetComponent<CardSO>();
            ui.Setup(so, this,false);
        }
    }
    public void LoadMenoryCollection() //수집품 열기
    {
        ReturnAllPanels();

        foreach (var kvp in DM.Memories)
        {
            var so = kvp.Value;
            var panelObj = GetPanel();
            var ui = panelObj.GetComponent<MemoryCard>();
            ui.Setup(so, this,false);
        }
    }
    private void LoadMemoryList()
    {
        var handle = Addressables.LoadAssetsAsync<MemorySO>("MemoryData", so =>
        {
            memoryList.Add(so);
        });  handle.Completed += result =>
        {
            if (result.Status == AsyncOperationStatus.Succeeded)
            {
                Debug.Log("Memory SOs Loaded!");
                InitPool();
            }
        };
    }
    
    public GameObject GetPanel() //패널 사용시 사용하는 메서드
    {
        foreach (GameObject obj in pool)
        {
            if (!obj.activeInHierarchy)
            {
                obj.SetActive(true);
                return obj;
            }
        }
        GameObject newObj = Instantiate(memory, content);
        pool.Add(newObj);
        return newObj;
    }

    public void ReturnAllPanels() // 모든 패널 비활성화
    {
        foreach (GameObject obj in pool)
        {
            obj.SetActive(false);
        }
    }
    public void ShowRandomMemories() //테스트용 메모리 카드 띄우기
    {
        ReturnAllPanels();
        
        int count = Mathf.Min(memoryList.Count, memoryList.Count);
        var chosen = new HashSet<int>();
        while (chosen.Count < count)
        {
            int idx = Random.Range(0, memoryList.Count);
            chosen.Add(idx);
        }

        foreach (int idx in chosen)
        {
            var panelObj = GetPanel();
            var ui = panelObj.GetComponent<MemoryCard>();
            ui.Setup(memoryList[idx], this, true);
        }
    }   

    public void ResetAllMemories() //다시 시작시에 스택 값과 수집품 초기화
    {
        foreach (var kvp in DM.Memories)
        {
            var m = kvp.Value;
            m.Stack = 0;
        }
        DM.Memories.Clear();
    }
}

 

그리고 팀원분이 작성해준 코드를 사용해서, 조건에 부합하면 엔딩으로 향하게 제작했다.


3. 학습하며 겪었던 문제점 & 에러

 

시간이 왜 24시간일까


4. 내일 학습 할 것은 무엇인지

 

우선 상단 UI바를 제작하고, 특정 씬일때엔 해당 UI바의 오브젝트 중 일부를 비활성화 처리도 해줘야하고

캐릭터 데이터를 데이터 매니저에 넣어줘서, 무슨 진영을 선택했는지까지 해야한다.

'TIL' 카테고리의 다른 글

25.04.25 TIL  (0) 2025.04.25
25.04.24 TIL  (0) 2025.04.24
25.04.22 TIL  (0) 2025.04.22
25.04.21 TIL  (0) 2025.04.21
25.04.18 TIL  (0) 2025.04.18