Spiral Defense/코드, 공부, 기록

Spiral Defense - GameManager

아리에 2020. 1. 27. 17:41

팀으로써 만들기는 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)
        {
            GameObject.Find("Main Camera").GetComponent<BGM>().NomalStage();
            bgm = !bgm;
        }
 
        if (stageLv % 100 == 0)
        {
            spManager.bStage = false;
            spManager.hStage = false;
            spManager.nStage = false;
            spManager.lbStage = true;
            GameObject.Find("Main Camera").GetComponent<BGM>().BossStage();
            bgm = !bgm;
            count = 10;
        }
        else if (stageLv % 10 == 0//보스 스폰
        {
            spManager.bStage = true;
            spManager.hStage = false;
            spManager.nStage = false;
            spManager.lbStage = false;
            GameObject.Find("Main Camera").GetComponent<BGM>().BossStage(); //BGM 변경
            bgm = !bgm;
            count = 1;
        }
        else if (stageLv % 10 == 5//매 5라운드 스폰
        {
            spManager.bStage = false;
            spManager.hStage = true;
            spManager.nStage = false;
            spManager.lbStage = false;
            deley = 1;
            count /= 2;
        }
        else //일반 스테이지
        {
            spManager.bStage = false;
            spManager.hStage = false;
            spManager.nStage = true;
            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 = ;
 
        enemyGold = PlayerPrefs.GetInt($"Gold");
        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
 

 

게임 로직입니다. 게임 로직이라는 거창 한 건 아니지만 처음 유저에게 주어지는 정보와 다음 스테이지로 넘어가는 것,   유닛 추가는 언제 되는 것이고 게임이 끝나면 무엇을 부르는지 를 보여줍니다.

실제 난이도 관련해서 변경 사항이 생기는 곳은 이곳입니다.

----------------------------------------------------------------------------------------------------------------------------------