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

Unity チュートリアルのタワーディフェンステンプレートを触ってみる(15)では砲弾に対して追加した Damager コンポーネントの解説を進めた。今回は同様に砲弾に対して追加した HitscanAttack コンポーネントに付いて解説を進めていく。

1.標的設定と砲撃編 – HitscanAttack.cs

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

「HitscanAttack.cs」は「Assets/Scripts/TowerDefense/Towers/Projectiles/HitscanAttack.cs」の指しておりスクリプトについては以下の通り。内容としてはダメージを与える処理を行っている。

[cce_csharp]using ActionGameFramework.Health;
using Core.Utilities;
using UnityEngine;

namespace TowerDefense.Towers.Projectiles
{
    /// <summary>
    /// Implementation of hitscan projectile
    /// The principle behind this weapon is that it instantly attacks enemies
    /// </summary>
    [RequireComponent(typeof(Damager))]
    public class HitscanAttack : MonoBehaviour
    {
        /// <summary>
        /// The amount of time to delay
        /// </summary>
        public float delay;

        /// <summary>
        /// The delay timer
        /// </summary>
        protected Timer m_Timer;

        /// <summary>
        /// The enemy this projectile will attack
        /// </summary>
        protected Targetable m_Enemy;

        /// <summary>
        /// The Damager attached to the object
        /// </summary>
        protected Damager m_Damager;

        /// <summary>
        /// The towers projectile position
        /// </summary>
        protected Vector3 m_Origin;

        /// <summary>
        /// Configuration for pausing the timer delay timer
        /// without setting Time.timeScale to 0
        /// </summary>
        protected bool m_PauseTimer;

        /// <summary>
        /// The delay configuration for the attacking
        /// </summary>
        /// <param name="origin">
        /// The point the attack will be fired from
        /// </param>
        /// <param name="enemy">
        /// The enemy to attack
        /// </param>
        public void AttackEnemy(Vector3 origin, Targetable enemy)
        {
            m_Enemy = enemy;
            m_Origin = origin;
            m_Timer.Reset();
            m_PauseTimer = false;
        }

        /// <summary>
        /// The actual attack of the hitscan attack.
        /// Early returns from the method if the there is no enemy to attack.
        /// </summary>
        protected void DealDamage()
        {
            Poolable.TryPool(gameObject);

            if (m_Enemy == null)
            {
                return;
            }
            
            // effects
            ParticleSystem pfxPrefab = m_Damager.collisionParticles;
            var attackEffect = Poolable.TryGetPoolable<ParticleSystem>(pfxPrefab.gameObject);
            attackEffect.transform.position = m_Enemy.position;
            attackEffect.Play();
            
            m_Enemy.TakeDamage(m_Damager.damage, m_Enemy.position, m_Damager.alignmentProvider);
            m_PauseTimer = true;
        }

        /// <summary>
        /// Cache the damager component attached to this object
        /// </summary>
        protected virtual void Awake()
        {
            m_Damager = GetComponent<Damager>();
            m_Timer = new Timer(delay, DealDamage);
        }

        /// <summary>
        /// Update the m_Timer if it is available
        /// </summary>
        protected virtual void Update()
        {
            if (!m_PauseTimer)
            {
                m_Timer.Tick(Time.deltaTime);
            }
        }
    }
}[/cce_csharp]

54行目 : 「public void AttackEnemy(Vector3 origin, Targetable enemy)」は攻撃する敵の設定を行っている。

66行目 : 「protected void DealDamage()」は攻撃する敵に対して攻撃エフェクトを出現させた後、敵のオブジェクトに対してダメージを与えている。

88行目 : 「protected virtual void Awake()」は Unity 固有の起動処理を行っている。内容としてはダメージャーコンポーネントの取得と、待機時間用のインスタンスを生成している。

97行目 : 「protected virtual void Update()」 は Unity 固有の更新処理を行っている。内容としては待機時間ごとにイベントを発生させている。

%d人のブロガーが「いいね」をつけました。