[Jem Clash] 개발일지 #2 - 자원 시스템 & 유닛 업그레이드 구현
자원 시스템 구현
지난 포스팅에 이어서, 자원 시스템을 먼저 구현해 주었습니다
네모의 정체는 플레이어가 위에 서 있으면 자원을 획득하는 공간이었습니다
현재 자원을 물자, 에너지 2가지 종류로 구분했기 때문에 공간을 2개 만들고, 자원을 ResourceManager라는 스크립트와 매니저를 사용해 관리하도록 했습니다
UI에는 현재 자원을 얼마나 가졌는지 표시하도록 했는데, 따로 로그를 안 띄워도 돼서 편리하네요
자원을 획득했으니, 이제 자원을 사용해야겠죠?
현재 물자를 이용해서 유닛을 소환하고, 에너지를 이용해 능력을 업그레이드하거나 해금하도록 기획한 상태입니다
처음엔 마우스 클릭으로 일정량의 자원을 소모하면 스폰 포인트에서 유닛을 소환하고, 이후 해금되는 자동 소환 버튼을 활용해 자동으로 소환하거나 필요할 땐 소환을 멈추도록 만들 예정입니다
가장 기본적인 자원 소모 & 유닛 소환을 위해 UnitSpawner에 코드를 추가했습니다
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public void SpawnAllyUnit(int count)
{
int maxCount = GameManager.Instance.resourceManager.supply / unitCost;
if (maxCount <= 0)
return;
count = Mathf.Min(count, maxCount);
for (int i = 0; i < count; i++)
{
GameObject allyUnit = GameManager.Instance.poolManager.Get(0);
SpawnUnit(allyUnit, allyData, spawnPoints[1].position);
}
GameManager.Instance.resourceManager.SpendSupply(unitCost * count);
}
이런 식으로 count, 즉 소환할 유닛의 숫자를 입력받으면 현재 가지고 있는 물자의 양과 비교하여 소환할 수 있는 최대 숫자만큼 소환하도록 해줬습니다
예를 들어 유닛당 소환 코스트가 5이고 3마리를 소환하고 싶은데, 현재 가지고 있는 물자가 12이면 물자 10을 소모해서 2마리를 소환하게 됩니다
테스트 결과 물자가 0일 때는 버튼을 눌러도 소환이 안 되지만, 이후 물자를 획득하고 다시 누르면 물자 5를 소모해서 유닛을 소환하게 됩니다
현재 1초에 자원을 2씩 획득하도록 만든 상태인데, 어느 세월에 자원을 모아서 부귀영화를 누리겠습니까
바로 자원 획득량을 늘리는 코드를 추가해 줍시다
그전에 우선 버튼을 눌러서 업그레이드하는 능력이 많아질 예정이니, Scriptable Object를 이용해서 레벨업 시스템을 구현해 주도록 하겠습니다
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[CreateAssetMenu(fileName = "Upgrade", menuName = "ScriptableObjects/UpgradeData")]
public class UpgradeData : ScriptableObject
{
public enum UpgradeType
{
UnitSpawn,
SupplyUp,
EnergyUp,
UnitAuto,
SpawnCount,
UnitHealth,
UnitAttack
}
public UpgradeType type;
public Sprite upgradeIcon;
[TextArea] public string upgradeDescription;
public int baseCount;
public int[] counts;
}
우선 업그레이드 능력들을 enum으로 정의해 주고, counts라는 정수형 배열에 업그레이드 수치들을 담아줍니다
생각해 보니 아이콘이랑 설명도 각각 만들어서 달아줘야 하는데… 미래의 누군가가 해주길 바라야겠죠
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public void OnClick()
{
switch (upgradeData.type)
{
case UpgradeData.UpgradeType.SupplyUp:
IncreaseSupply();
IncrementLevel();
break;
}
}
private void IncreaseSupply()
{
GameManager.Instance.resourceManager.SupplyAmountUp(
upgradeData.counts[level]);
}
private void IncrementLevel()
{
level++;
}
이런 식으로 타입에 따라 스위치 문을 만들고, 인스펙터에서 이것저것 잘 연결해 주면,
Supply Up 버튼을 누르면 물자 획득량이 증가하는 것을 확인할 수 있어요
Energy Up 버튼도 똑같이 적용해 주면, 기본적인 자원 획득 시스템이 완성되었습니다 👍
유닛 업그레이드
이제 유닛들을 스펙업해줄 차례가 왔습니다
우선 한 번에 소환하는 유닛 개수, 유닛 체력, 유닛 소환 자동화 3가지를 구현할 예정입니다
가장 쉬워 보이는 유닛 개수부터 진행해 보죠
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public void OnClick()
{
switch (upgradeData.type)
{
case UpgradeData.UpgradeType.SpawnCount:
IncreaseSpawnCount();
IncrementLevel();
break;
}
}
private void IncreaseSpawnCount()
{
GameManager.Instance.unitSpawner.spawnCount += upgradeData.counts[level];
}
좀 전의 Onclick 메서드에 SpawnCount에 해당하는 부분을 추가해 주고, 마찬가지로 upgradeData를 가져와서 반영해 줍니다
테스트를 위해 Supply Up을 최대로 업그레이드하고 진행해 보면, Spawn Count 버튼을 누르고 소환할 때마다 소환되는 유닛 수가 1개씩 증가하는 것을 볼 수 있어요
다음으로 쉬워 보이는 유닛 소환 자동화를 만들어줍시다
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public void SetAutoSpawn(bool value)
{
isAutoSpawn = value;
if (isAutoSpawn)
StartCoroutine(SpawnUnitsCoroutine());
else
StopCoroutine(SpawnUnitsCoroutine());
}
private IEnumerator SpawnUnitsCoroutine()
{
while (isAutoSpawn)
{
SpawnAllyUnit(spawnCount);
yield return new WaitForSeconds(autoSpawnInterval);
}
}
UnitSpawner 스크립트에 새로운 코루틴을 추가해 주고, 이를 제어하는 SetAutoSpawn 메서드를 버튼을 누를 때마다 불러와 줍니다
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public void OnClick()
{
switch (upgradeData.type)
{
case UpgradeData.UpgradeType.UnitAuto:
ToggleAutoSpawn();
break;
}
}
private static void ToggleAutoSpawn()
{
GameManager.Instance.unitSpawner.SetAutoSpawn(
!GameManager.Instance.unitSpawner.isAutoSpawn);
}
ToggleAutoSpawn이라는 거창한 이름을 써줬지만… 예 그냥 true false 바꾸는 메서드입니다 😅
그나저나 제가 코딩할 때 사용하고 있는 테마가 One Dark Theme인데, 블로그 포스팅에도 테마를 적용해 보고 싶네요
뭔가 지금은 코드가 너무 밋밋한 느낌…
이런 식으로 보이면 훨씬 예쁠 텐데, 한번 방법을 찾아볼게요
Unit Auto 버튼을 누르면 자동으로 유닛이 소환되는 모습입니다
이제 유닛 체력에 대한 부분만 구현해 주면 되는데, 예상치 못한 문제에 부딪히기도 했고, 글이 생각보다 많이 길어져서 다음 포스팅에 이어서 올리겠습니다 👋