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

Unity チュートリアルのタワーディフェンステンプレートを触ってみる(40)ではタワーを配置するための TowerPlacementGrid の解説を行った。今回は本拠地の設定に必要な PlayerHomeBase の解説を行っていく。

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

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

「PlayerHomeBase.cs」は「Assets/Scripts/TowerDefense/Level/PlayerHomeBase.cs」の指しておりスクリプトについては以下の通り。内容としてはグリッド状のタワー設置に関するを行っている。


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
136
137
138
using System.Collections.Generic;
using ActionGameFramework.Audio;
using Core.Health;
using TowerDefense.Agents;
using UnityEngine;

namespace TowerDefense.Level
{
    /// <summary>
    /// A class representing the home base that players must defend
    /// </summary>
    public class PlayerHomeBase : DamageableBehaviour
    {
        /// <summary>
        /// The particle system when an attack is charging
        /// </summary>
        public ParticleSystem chargePfx;

        /// <summary>
        /// Sound to play when charge effect starts
        /// </summary>
        public RandomAudioSource chargeSound;
       
        /// <summary>
        /// The particle system for an attack
        /// </summary>
        public ParticleSystem attackPfx;
       
        /// <summary>
        /// Sound to play when attack effect starts
        /// </summary>
        public RandomAudioSource attackSound;

        /// <summary>
        /// The current Agents within the home base attack zone
        /// </summary>
        protected List<Agent> m_CurrentAgentsInside = new List<Agent>();

        /// <summary>
        /// Subscribes to damaged event
        /// </summary>
        protected virtual void Start()
        {
            configuration.damaged += OnDamaged;
        }

        /// <summary>
        /// Unsubscribes to damaged event
        /// </summary>
        protected virtual void OnDestroy()
        {
            configuration.damaged -= OnDamaged;
        }

        /// <summary>
        /// Plays <see cref="attackPfx"/> if assigned
        /// </summary>
        protected virtual void OnDamaged(HealthChangeInfo obj)
        {
            if (attackPfx != null)
            {
                attackPfx.Play();
            }
            if (attackSound != null)
            {
                attackSound.PlayRandomClip();
            }
        }
       
        /// <summary>
        /// Adds triggered Agent to tracked Agents, subscribes to Agent's
        /// removed event and plays pfx
        /// </summary>
        /// <param name="other">Triggered collider</param>
        void OnTriggerEnter(Collider other)
        {
            var homeBaseAttacker = other.GetComponent<HomeBaseAttacker>();
            if (homeBaseAttacker == null)
            {
                return;
            }
            m_CurrentAgentsInside.Add(homeBaseAttacker.agent);
            homeBaseAttacker.agent.removed += OnAgentRemoved;
            if (chargePfx != null)
            {
                chargePfx.Play();
            }
            if (chargeSound != null)
            {
                chargeSound.PlayRandomClip();
            }
        }
       
        /// <summary>
        /// If the entity that has entered the collider
        /// has an <see cref="Agent"/> component on it
        /// </summary>
        void OnTriggerExit(Collider other)
        {
            var homeBaseAttacker = other.GetComponent<HomeBaseAttacker>();
            if (homeBaseAttacker == null)
            {
                return;
            }
            RemoveTarget(homeBaseAttacker.agent);
        }
       
        /// <summary>
        /// Removes Agent from tracked <see cref="m_CurrentAgentsInside"/>
        /// </summary>
        void OnAgentRemoved(DamageableBehaviour targetable)
        {
            targetable.removed -= OnAgentRemoved;
            Agent attackingAgent = targetable as Agent;
            RemoveTarget(attackingAgent);
        }

        /// <summary>
        /// Removes <paramref name="agent"/> from <see cref="m_CurrentAgentsInside"/> and stops pfx
        /// if there are no more <see cref="Agent"/>s
        /// </summary>
        /// <param name="agent">
        /// The agent to remove
        /// </param>
        void RemoveTarget(Agent agent)
        {
            if (agent == null)
            {
                return;
            }
            m_CurrentAgentsInside.Remove(agent);
            if (m_CurrentAgentsInside.Count == 0 && chargePfx != null)
            {
                chargePfx.Stop();
            }
        }
    }
}

12行目 : 「public class PlayerHomeBase : DamageableBehaviour」は DamageableBehaviour を継承していることを指している。

DamageableBehaviour の解説については以前に行っているため、こちらを参照してほしい。

42行目 : 「protected virtual void Start()」は Unity 固有の開始処理を行っている。内容としてはダメージを受けた時の処理 OnDamaged の設定をしている。

50行目 : 「protected virtual void OnDestroy()」は Unity 固有の破壊処理を行っている。内容としてはダメージを受けた時の処理 OnDamaged の設定を解除している。

58行目 : 「protected virtual void OnDamaged(HealthChangeInfo obj)」はダメージの処理を行っている。内容としてはダメージを受けた時のエフェクトと音声を実行している。

75行目 : 「void OnTriggerEnter(Collider other)」は Unity 固有の他の Collider がこのゲームオブジェクトの Collider に入ったときの処理を行っている。内容としては入ってきた Collider が HomeBaseAttacker であれば、ホームベースにいる Agent として m_CurrentAgentsInside に追加し、OnAgentRemoved 処理を Agent の removed に登録後、HomeBaseAttacker の攻撃エフェクトと攻撃音を実行している。

98行目 : 「void OnTriggerExit(Collider other)」は Unity 固有の他の Collider がこのゲームオブジェクトの Collider から出ていったときの処理を行っている。内容としては出ていった Collider が HomeBaseAttacker であれば、RemoveTarget の処理を行っている。

111行目 : 「void OnAgentRemoved(DamageableBehaviour targetable)」は Agent の removed から OnAgentRemoved 処理を解除後、RemoveTarget の処理を行っている。

125行目 : 「void RemoveTarget(Agent agent)」は m_CurrentAgentsInside 登録されている Agent を削除後、HomeBaseAttacker の攻撃エフェクトを終了している。

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