1. 오늘 학습 키워드
미니 게임 연결 및 메모리 제작
2. 오늘 학습 한 내용을 나만의 언어로 정리하기
원래 1. 이런 식으로 미니 게임 패널만 생성하도록 제작했다.
이제 이 부분을 연결 시켰고,
이번에는 MiniGameData SO를 제작할 때, 씬 이름과 라벨을 함께 추가하여, 라벨과 씬 이름을 SO에 넣어서, 코드의 중복을 줄여보고자 했다.
using System.Collections.Generic;
using UnityEngine;
[CreateAssetMenu(menuName = "Game/MiniGame Data")]
public class MiniGameDataSO : ScriptableObject
{
public string title;
public int index;
public bool isLocked;
public string sceneName;
public string label;
}
첫 로드를 제작할 때, 사용했던 코드가 계속 사용된다.
라벨과 <>안에 타입을 넣어주고, 로드 해주는데 이번에는 data에 라벨과 씬 이름을 넣었기에 data.sceneName, data.label 으로
원래 스위치를 사용해서 하드 코딩을 하려했으나, 많이 축약되었다.
private void LoadMiniGame(int index)
{
Addressables.LoadAssetsAsync<MiniGameDataSO>("MiniGame", null).Completed += handle =>
{
if (handle.Status == AsyncOperationStatus.Succeeded)
{
var allMiniGames = handle.Result.ToList();
var data = allMiniGames.Find(x => x.index == index);
if (data != null)
{
var loadData = new LoadingSceneData
{
mappings = new AssetLabelMapping[]
{
new AssetLabelMapping { label = data.label, assetType = AssetType.MiniGameDataSO }
},
tipChangeInterval = 2f,
nextSceneName = data.sceneName,
payload = index
};
LoadScene("LoadingScene", loadData);
}
}
};
}
그리고 로딩 컨트롤을 제작하면서
원래 이 코드가 OnDestory로 되어있었는데, 로딩 컨트롤러가 파괴될 때, 클리어가 되는 방법이였다.
이 경우, 로딩 씬을 넘어가야하기에, 로딩이 끝나면 로드 했던 내용이 다 클리어가 되기에, 사실상 로드가 되질 않는다.
이 부분은 팀원분이 오디오 작업을 하시며, 말씀해주셔서, OnEnable에 아래 메서드를 넣어주었다.
Start로부터 로드가 시작이 되기에, Start 이전 생명주기인 OnEnable에 클리어를 넣어줘, 이전에 사용한 내용을 해제하고
다음 씬에 필요한 내용은 로드해주는 방법으로 변경해주었다.
private void ClearLoadedAssets()
{
if (isUnloading) return;
isUnloading = true;
foreach (var kv in handles)
if (kv.Value.IsValid())
Addressables.Release(kv.Value);
handles.Clear();
loadedAssets.Clear();
Resources.UnloadUnusedAssets();
}
그리고 엔딩의 기준이 될 기억의 조각을 제작했다.
이건 기억을 세팅해주는 과정으로, 텍스트 및 bool 상태에 따라 버튼을 사용이 되도록 했다.
public void Setup(MemorySO so, MemoryPanel panel, bool isReward) //기억 세팅
{
data = so;
pool = panel;
this.isReward = isReward;
memoryName.text = data.MemoryName;
valueText.text = data.Stack.ToString();
button.onClick.RemoveAllListeners();
valueText.text = $"공격력 + {data.AtkValue}\n정신력 회복 + {data.HealValue}";
if (isReward)
{
button.interactable = true;
button.onClick.AddListener(OnSelected);
}
else
{
button.interactable = false;
}
}
데이터 시트를 통해 제작된 메모리 데이터는 어드레서블을 통해 알아서 할당되도록 했다.
이 방법을 사용해서 방법을 몰라서 직접 리스트에 넣어주었던 방법을 추후 리팩토링을 하며 수정할 예정이다.
private void LoadMemoryList()
{
Addressables.LoadAssetsAsync<MemorySO>("MemoryData", so =>
{
memoryList.Add(so);
}).Completed += handle =>
{
if (handle.Status == AsyncOperationStatus.Succeeded)
{
Debug.Log("Memory SOs Loaded!");
}
};
}
수집품을 열 경우, 리스트에 저장이 된 부분을 보여주는 방법을 선택했다.
public void LoadCollection() //수집품 열기
{
ReturnAllPanels();
foreach (var so in collection)
{
var panelObj = GetPanel();
var ui = panelObj.GetComponent<Memory>();
ui.Setup(so, this,false);
}
}
마지막으로 이 메모리도 풀 오브젝트를 사용해서 관리해줬다.
3. 학습하며 겪었던 문제점 & 에러
우선 OnDestory 이슈가 있었고, 수집품을 잘못 이해해서, 방향서을 잘못 잡았던게 문제였다.
4. 내일 학습 할 것은 무엇인지
컬렉션에 대해 작업을 끝내고, 도트윈을 통해서 팝업이나 수집품 열었을 때에 애니메이션을 추가할 예정이다.
'TIL' 카테고리의 다른 글
25.04.23 TIL (0) | 2025.04.23 |
---|---|
25.04.22 TIL (0) | 2025.04.22 |
25.04.18 TIL (0) | 2025.04.18 |
25.04.17 TIL (0) | 2025.04.17 |
25.04.16 TIL (0) | 2025.04.16 |