팀으로써 만들기는 3번째 게임이고요. 출시로는 첫 번째 게임이네요.
만들 때마다 조금씩 나아지고는 있지만 코드의 양이 점점 많아지고 기능을 이것저것 추가하다 보면 구조적으로 부족하단 것을 많이 느낍니다. 여전히 공부를 많이 해야겠네요.
앞서 게임의 흐름도에 대해 글을 올렸지요. 그 흐름대로 코드를 띄어 설명을 하고 싶지만 스크립트 1~3개를 왔다 갔다 하며 보는 게 지저분할 것 같아 하나씩 올리고 설명하려 합니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
private void Start()
{
GameInit();
uiManager.StartInit();
uiManager.LanguageSetting(PlayerPrefs.GetInt("lg"));
}
private void Update()
{
if (spawnTime && count > 0)
StartCoroutine(SpawnCoroutine()); //적 스폰
if (catTalk)
CatScript();
}
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter
|
|
Start입니다. 이 전에 XML에서 읽어와 게임에 필요한 요소들을 PlayerPlayerPrefs에 값을 저장했습니다.
기본적인 초기화 과정을 진행하고 있습니다.
Update에서는 2가지 일을 하는데 하나는 냥냥이의 대사를 몇 초마다 주기적으로 뿌려주는 메서드와
코 루틴으로 적의 스폰을 제어합니다.
UIManager 연동은 게임에 필요한 요소들을 UIManager 스크립트로 보내 즉각적으로 UI가 보이게 해 줍니다.
UIManager에 Start(), Update를 쓰지 않으려고 하니 시간과 관련 있는 부분은 GameManager에서 관리할 수밖에 없었습니다.
실시간으로 보이는 Text입니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
|
IEnumerator SpawnCoroutine() // 적 스폰 선택
{
spawnTime = false; //연속 코루틴 방지
float deley = 0; //5라운드 전용 딜레이
if (bgm)
{
bgm = !bgm;
}
if (stageLv % 100 == 0)
{
spManager.lbStage = true;
bgm = !bgm;
count = 10;
}
else if (stageLv % 10 == 0) //보스 스폰
{
spManager.lbStage = false;
bgm = !bgm;
count = 1;
}
else if (stageLv % 10 == 5) //매 5라운드 스폰
{
spManager.lbStage = false;
deley = 1;
count /= 2;
}
else //일반 스테이지
{
spManager.lbStage = false;
}
yield return new WaitForSeconds(loadingTime); //스테이지 전환 후 딜레이
while (count > 0)
{
spManager.EnemySpawn();
if (stageLv % 10 == 5)
yield return new WaitForSeconds(3f / (count * 2)); //스폰 딜레이
else if(stageLv % 100 == 0)
yield return new WaitForSeconds(2f); //스폰 딜레이
else
yield return new WaitForSeconds(0.3f - GetStageLv() / 300f); //스폰 딜레이
count--;
}
yield return new WaitForSeconds(deley);
spawnTime = true;
}
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter
|
|
코루틴 내부입니다. 여기서는 spManager에게 현재 라운드에 맞는 적을 뽑게 제어하고 적이 스폰 시간을 제어합니다.
코루틴 안에서 분기문이 많아서 코드가 길어졌습니다. 코루틴 안에서 해야 할 일이 아닌 것은 밖으로 빼는 것이 중요했다고 생각하네요. 12줄부터 47줄 까지도 더 좋은 방법이 있을 텐데 하는 아쉬움이 있습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
public void NextStage()
{
if (!spawnTime)
return;
if (GetStageLv() == 100)
uiManager.GameClear();
SetStageLv();
count = unitCount + * (stageLv / );
}
private void GameInit()
{
spawnTime =;
stageLv = ;
playerGold = ;
life = ;
unitCount = ;
count = ;
loadingTime = ;
uiManager.Possession();
uiManager.LifeSet();
uiManager.StageSet();
}
public void GameOver()
{
SceneManager.LoadScene("playScene");
}
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter
|
|
게임 로직입니다. 게임 로직이라는 거창 한 건 아니지만 처음 유저에게 주어지는 정보와 다음 스테이지로 넘어가는 것, 유닛 추가는 언제 되는 것이고 게임이 끝나면 무엇을 부르는지 를 보여줍니다.
실제 난이도 관련해서 변경 사항이 생기는 곳은 이곳입니다.
----------------------------------------------------------------------------------------------------------------------------------
'Spiral Defense > 코드, 공부, 기록' 카테고리의 다른 글
Spiral Defense 기본 흐름도 (0) | 2020.01.27 |
---|