내일배움캠프 78일차 TIL + 유닛 딕셔너리 추가
작업 내용
기존 코드 수정
기존에 DataManager
에서 스테이지 진행 도중에 데이터를 저장하려고 했지만, 이제는 스테이지 갯수를 늘리고 스테이지당 웨이브를 줄여 앵그리버드 같은 진행 방식으로 변경했다. 따라서 스테이지가 끝나고 나서 저장해도 문제가 없어졌다. 이에 따라 DataManager
에서 관리하는 데이터를 수정했다.
// 유닛 SO 모음
public UnitStatData[] UnitSO;
// 적 SO 모음
public EnemyStatData[] EnemySO;
// 씬 이동용 볼륨 값
public float masterVolume;
public float bgmVolume;
public float sfxVolume;
// 해금된 유닛 ID
public List<int> UserUnitIDs;
// 스테이지 클리어 정보
public StageData[] StageDatas = new StageData[3];
기존에는 여러 곳에서 상수나 Tag, Layer 값을 직접 적어서 사용했는데, 이를 한 곳에 모으는 방법을 찾았다:
public static class Constants
{
// 태그 이름
public static class Tags
{
public const string Player = "Player";
public const string Enemy = "Enemy";
// 여기에 다른 태그들을 추가
}
// 레이어 이름
public static class Layers
{
public const string Default = "Default";
public const string TransparentFX = "TransparentFX";
public const string IgnoreRaycast = "IgnoreRaycast";
public const string Water = "Water";
public const string UI = "UI";
// 여기에 다른 레이어들을 추가
}
// 씬 이름
public static class Scenes
{
public const string MainScene = "MainScene";
public const string GameScene = "GameScene";
public const string TutorialScene = "TutorialScene";
public const string StageChoiceScene = "StageChoiceScene";
public const string UnitDictionary = "UnitDictionary";
// 여기에 다른 씬 이름들을 추가
}
// 기타 상수
public static class GameSettings
{
// 게임 처음 할 경우 세팅 값
// 사용 가능한 유닛 ID 목록
public static readonly List<int> InitialUsableUnitIDs = new List<int>()
{
0, 1, 2, 3, 4
};
// 스테이지 세팅 정보
public static readonly StageData[] InitialStageDatas = new StageData[3]
{
new StageData { Clear = false, Stars = 0 },
new StageData { Clear = false, Stars = 0 },
new StageData { Clear = false, Stars = 0 }
};
// 여기에 다른 게임 설정 상수들을 추가
}
}
static
클래스에 서브 클래스로 종류별로 나누어 사용하는 방법을 찾았다. 이전에는 static
클래스에 상수를 저장할 생각만 했지만, 이렇게 다양한 종류를 구분하여 서브 클래스를 사용하는 방법을 통해 보다 체계적으로 관리할 수 있었다.
유닛 딕셔너리 제작
위와 같이 유닛들을 보여주는 유닛 사전을 만들었다. 해금된 유닛만 클릭이 가능하고, 나머지는 스테이지를 클리어한 보상으로 키를 받으면 해금할 수 있게 해줄 예정이다. 게임에서는 이제부터 해금된 유닛만 사용할 수 있게 할 예정이다. UnitDataManager.cs로 해당 사전 씬을 컨트롤하는 코드에 주요 내용이다 :
private void ShowUserUnits()
{
List<int> usableUnitIDs = DataManager.Instance.UserUnitIDs;
int unitCount = userUnitSprites.Length;
for (int i = 0; i < unitCount; i++)
{
// 컨텐츠 오브젝트 생성
GameObject gameObject = Instantiate(dictionaryContent.gameObject);
gameObject.transform.parent = parentContent;
DictionaryUnit dict = gameObject.GetComponent<DictionaryUnit>();
// 컨텐츠 내용 채우기
dict.Icon.sprite = userUnitSprites[i];
dict.UnitName.SetText(DataManager.Instance.UnitSO[i].CharacterName);
dict.UnitDescription.SetText(DataManager.Instance.UnitSO[i].CharacterDescription);
// 사용 가능한 경우에만 잠금 해제
if (usableUnitIDs.Contains(i))
{
dict.UnLock();
}
else
{
dict.Lock();
}
}
}
추가 작업 계획
앞으로는 플레이어 유닛 사전과 적 유닛 사전을 만들어 적 유닛은 만난 유닛만 표시하고 나머지는 검은색으로 가려둘 계획이다. 유닛을 사전에서 클릭하면 구체적인 스탯 정보를 표시할 예정이다. 먼저, 스테이지를 끝내면 열쇠를 주는 시스템을 만들고, 열쇠로 유닛을 해금하는 시스템을 구현하며, 인스펙터 창에서 등록된 인게임 사용 가능 유닛 대신 해금된 유닛 목록을 기준으로 사용할 수 있게 할 예정이다.
마무리
오늘은 여러 코드 수정과 새로운 유닛 사전 제작을 진행했다. 앞으로의 작업 계획에 따라 기능을 확장해 나가며, 게임의 완성도를 높여갈 예정이다.