Unity チュートリアルのタワーディフェンステンプレートを触ってみる(45)

Unity チュートリアルのタワーディフェンステンプレートを触ってみる(44)では Agent の Wave を登録する Wave について解説を行った。今回は Wave を登録し管理する WaveManager に付いて解説を行っていく。

1.タワーディフェンステンプレートのステージの設定編 – WaveManager.cs

WaveManager.cs について稚拙ながら解説

「WaveManager.cs」は「Assets/Scripts/TowerDefense/Level/WaveManager.cs」の指しておりスクリプトについては以下の通り。内容としては Wave の生成管理を行っている。


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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
using System;
using System.Collections.Generic;
using Core.Extensions;
using UnityEngine;

namespace TowerDefense.Level
{
    /// <summary>
    /// WaveManager - handles wave initialisation and completion
    /// </summary>
    public class WaveManager : MonoBehaviour
    {
        /// <summary>
        /// Current wave being used
        /// </summary>
        protected int m_CurrentIndex;

        /// <summary>
        /// Whether the WaveManager starts waves on Awake - defaulted to null since the LevelManager should call this function
        /// </summary>
        public bool startWavesOnAwake;

        /// <summary>
        /// The waves to run in order
        /// </summary>
        [Tooltip("Specify this list in order")]
        public List<Wave> waves = new List<Wave>();

        /// <summary>
        /// The current wave number
        /// </summary>
        public int waveNumber
        {
            get { return m_CurrentIndex + 1; }
        }

        /// <summary>
        /// The total number of waves
        /// </summary>
        public int totalWaves
        {
            get { return waves.Count; }
        }

        public float waveProgress
        {
            get
            {
                if (waves == null || waves.Count <= m_CurrentIndex)
                {
                    return 0;
                }
                return waves[m_CurrentIndex].progress;
            }
        }

        /// <summary>
        /// Called when a wave begins
        /// </summary>
        public event Action waveChanged;

        /// <summary>
        /// Called when all waves are finished
        /// </summary>
        public event Action spawningCompleted;

        /// <summary>
        /// Starts the waves
        /// </summary>
        public virtual void StartWaves()
        {
            if (waves.Count > 0)
            {
                InitCurrentWave();
            }
            else
            {
                Debug.LogWarning("[LEVEL] No Waves on wave manager. Calling spawningCompleted");
                SafelyCallSpawningCompleted();
            }
        }

        /// <summary>
        /// Inits the first wave
        /// </summary>
        protected virtual void Awake()
        {
            if (startWavesOnAwake)
            {
                StartWaves();
            }
        }

        /// <summary>
        /// Sets up the next wave
        /// </summary>
        protected virtual void NextWave()
        {
            waves[m_CurrentIndex].waveCompleted -= NextWave;
            if (waves.Next(ref m_CurrentIndex))
            {
                InitCurrentWave();
            }
            else
            {
                SafelyCallSpawningCompleted();
            }
        }

        /// <summary>
        /// Initialize the current wave
        /// </summary>
        protected virtual void InitCurrentWave()
        {
            Wave wave = waves[m_CurrentIndex];
            wave.waveCompleted += NextWave;
            wave.Init();
            if (waveChanged != null)
            {
                waveChanged();
            }
        }

        /// <summary>
        /// Calls spawningCompleted event
        /// </summary>
        protected virtual void SafelyCallSpawningCompleted()
        {
            if (spawningCompleted != null)
            {
                spawningCompleted();
            }
        }
    }
}

70行目 : 「public virtual void StartWaves()」は Wave の開始処理を行っている。内容としては Wave の設定があれば InitCurrentWave を行い、設定がなければ警告メッセージを出力後、SafelyCallSpawningCompleted を行っている。

86行目 : 「protected virtual void Awake()」は Unity 固有の起動処理を行っている。内容としては startWavesOnAwake が True であれば StartWaves を行っている。

97行目 : 「protected virtual void NextWave()」は次の Wave 出現処理を行っている。内容としては Wave の waveCompleted から NextWave を解除後、次の Wave が存在していれば、 InitCurrentWave を行い、存在していなければ SafelyCallSpawningCompleted を行っている。

113行目 : 「protected virtual void InitCurrentWave()」は Wave の初期化処理を行っている。Wave の配列から Wave を取得し、Wave の waveCompleted に NextWave を設定後、waveChanged の設定があれば waveChanged を実行している。

127行目 : 「protected virtual void SafelyCallSpawningCompleted()」は Agent のスポーンが完了時の処理を行っており、spawningCompleted の設定があれば spawningCompleted の処理を行っている。

スポンサーリンク
%d人のブロガーが「いいね」をつけました。