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

Unity チュートリアルのタワーディフェンステンプレートを触ってみる(24)では「その他の効果、ビジュアライザー、挙動編」を進めた。今回はエージェントに追加した HealthBar に付属している HealthVisualizer の解説を行っていく。

1.その他の効果、ビジュアライザー、挙動編 – HealthVisualizer.cs

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

「HealthVisualizer.cs」は「Assets/Scripts/Core/Health/HealthVisualizer.cs」の指しておりスクリプトについては以下の通り。内容としては HealthBar の更新処理を行っている。

[cce_csharp]using UnityEngine;

namespace Core.Health
{
    /// <summary>
    /// Class to visualizer the health of a damageable
    /// </summary>
    public class HealthVisualizer : MonoBehaviour
    {
        /// <summary>
        /// The DamageableBehaviour that will be used to assign the damageable
        /// </summary>
        [Tooltip("This field does not need to be populated here, it can be set up in code using AssignDamageable")]
        public DamageableBehaviour damageableBehaviour;
        
        /// <summary>
        /// The object whose X-scale we change to decrease the health bar. Should have a default uniform scale
        /// </summary>
        public Transform healthBar;
        
        /// <summary>
        /// The object whose X-scale we change to increase the health bar background. Should have a default uniform scale
        /// </summary>
        public Transform backgroundBar;

        /// <summary>
        /// Whether to show this health bar even when it is full
        /// </summary>
        public bool showWhenFull;

        /// <summary>
        /// Camera to face the visualization at
        /// </summary>
        protected Transform m_CameraToFace;

        /// <summary>
        /// Damageable whose health is visualized
        /// </summary>
        protected Damageable m_Damageable;

        /// <summary>
        /// Updates the visualization of the health
        /// </summary>
        /// <param name="normalizedHealth">Normalized health value</param>
        public void UpdateHealth(float normalizedHealth)
        {
            Vector3 scale = Vector3.one;

            if (healthBar != null)
            {
                scale.x = normalizedHealth;
                healthBar.transform.localScale = scale;
            }

            if (backgroundBar != null)
            {
                scale.x = 1 - normalizedHealth;
                backgroundBar.transform.localScale = scale;
            }

            SetVisible(showWhenFull || normalizedHealth < 1.0f);
        }

        /// <summary>
        /// Sets the visibility status of this visualiser
        /// </summary>
        public void SetVisible(bool visible)
        {
            gameObject.SetActive(visible);
        }

        /// <summary>
        /// Assigns the damageable, subscribing to the damaged event
        /// </summary>
        /// <param name="damageable">Damageable to assign</param>
        public void AssignDamageable(Damageable damageable)
        {
            if (m_Damageable != null)
            {
                m_Damageable.healthChanged -= OnHealthChanged;
            }
            m_Damageable = damageable;
            m_Damageable.healthChanged += OnHealthChanged;
        }

        /// <summary>
        /// Turns us to face the camera
        /// </summary>
        protected virtual void Update()
        {
            Vector3 direction = m_CameraToFace.transform.forward;
            transform.forward = -direction;
        }

        /// <summary>
        /// Assigns a damageable if damageableBehaviour is populated
        /// </summary>
        protected virtual void Awake()
        {
            if (damageableBehaviour != null)
            {
                AssignDamageable(damageableBehaviour.configuration);
            }
        }

        /// <summary>
        /// Caches the main camera
        /// </summary>
        protected virtual void Start()
        {
            m_CameraToFace = UnityEngine.Camera.main.transform;
        }

        void OnHealthChanged(HealthChangeInfo healthChangeInfo)
        {
            UpdateHealth(m_Damageable.normalisedHealth);
        }
    }
}[/cce_csharp]

45行目 : 「public void UpdateHealth(float normalizedHealth)」は体力ゲージの更新を行っている。内容としては引数として正規化(0 ~ 1)に変換された体力を受け取っており、体力バーとバックグラウンドバーがあれば正規化した割合で更新を行っている。

76行目 : 「public void AssignDamageable(Damageable damageable)」は Damageable の割当を行っている。内容としては引数の Damageable を自身のグローバル変数に代入し、Damageable の healthChanged に OnHealthChanged 関数を設定している。

89行目 : 「protected virtual void Update()」は Unity 固有の更新処理を行っている。内容としては HealthBar を正面に向けるように調整している。

98行目 : 「protected virtual void Awake()」は Unity 固有の起動処理を行っている。

109行目 : 「protected virtual void Start()」は Unity 固有の開始処理処理を行っている。

114行目 : 「void OnHealthChanged(HealthChangeInfo healthChangeInfo)」は UpdateHealth の処理を行っている。

 

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