【バイオハザード風のゲームを作ってみよう。その19】

今回もこちらをやっていきます。
youtu.be

プレイヤーのHealth表示を実装していきます。

・Health画像を準備します。私はGoogleスライドで作りました。

・準備した画像を画面に表示させます。

・心電図風のアニメーションを作っていきます。また、心電図の軌跡をはっきりする為にparticle Systemを使用します。

・下記スクリプトを追加します。

public class StatusPopUpsUI : MonoBehaviour //EP19追加 PlauerUI直下のStatus Pop Upsにアタッチ
{
    CanvasGroup canvasGroup;
    [SerializeField] GameObject popUpFineFull;
    [SerializeField] GameObject popUpFineDamagrd;
    [SerializeField] GameObject popUpCaution;
    [SerializeField] GameObject popUpDanger;

    [Header("Fade Options")]
    [SerializeField] float timeBeforeFadeOutBegins=2f;

    private void Awake()
    {
        canvasGroup = GetComponent<CanvasGroup>();
    }

    //画像をOFFする
    private void DisableAllPopUps()
    {
        popUpFineFull.SetActive(false);
        popUpFineDamagrd.SetActive(false);
        popUpCaution.SetActive(false);
        popUpDanger.SetActive(false);
    }

    //プレイヤーHPにより表示する画像を変更
    public void DisplayHealthPopUp(int playerHealthPercentage)
    {
        if (playerHealthPercentage >= 100)
        {
            popUpFineFull.SetActive(true);
        }
        else if (playerHealthPercentage >= 66 && playerHealthPercentage<=99)
        {
            popUpFineDamagrd.SetActive(true);
        }
        else if (playerHealthPercentage >= 33 && playerHealthPercentage <= 65)
        {
            popUpCaution.SetActive(true);
        }
        else if (playerHealthPercentage >= 1 && playerHealthPercentage <= 29)
        {
            popUpDanger.SetActive(true);
        }

        StartCoroutine(FadeInPopUp());
    }

    IEnumerator FadeInPopUp()
    {
        //徐々に画像のアルファを上げていく
        for (float fade = 0.05f; fade < 1; fade =fade + 0.05f)
        {
            canvasGroup.alpha = fade;
            //アルファが一定値に達したら、徐々にアルファを下げる
            if (fade > 0.9f)
            {
                StartCoroutine(FadeOutPopUp());
            }

            Debug.Log("We are fading in the pop up");
            yield return new WaitForSeconds(0.05f);
        }
       
    }

    IEnumerator FadeOutPopUp()
    {
        //WAIT A SECOND BEFORE WE FADE OUT
        yield return new WaitForSeconds(timeBeforeFadeOutBegins);
        //徐々にアルファを下げる
        for (float fade = 1; fade > 0; fade = fade - 0.05f)
        {
            canvasGroup.alpha = fade;
            //アルファが一定値に達したら、画像をOFFする
            if (fade <= 0.05f)
            {
                DisableAllPopUps();
            }

            Debug.Log("We are fading out the pop up");
            yield return new WaitForSeconds(0.05f);
        }
    }
}
public class PlayerUIManager : MonoBehaviour //EP6追加 Canvasにアタッチ
{
    PlayerManager player; //EP19追加

    StatusPopUpsUI statusPopUpsUI; //EP19追加

    [Header("Crosshair")]
    public GameObject crosshair;

    [Header("Ammo")]
    public Text currentAmmoCountText;   //EP14追加 //現在装備している銃の残弾数を表示
    public Text reservedAmmoCountText;  //EP14追加 //現在装備している銃の残弾数の総数表示

    private void Awake() //EP19追加
    {
        player = FindObjectOfType<PlayerManager>();
        statusPopUpsUI = GetComponentInChildren<StatusPopUpsUI>();
    }

    //EP19追加 プレイヤーのHealth表示を制御する
    public void DisplayHealthPopUp()
    {
        statusPopUpsUI.DisplayHealthPopUp(player.playerStatManager.playerHealth);
    }
}
public class PlayerStatManager : MonoBehaviour //EP18追加 プレイヤーにアタッチ
{
 (省略)
 public void TakeDamageFromGrapple()
    {
        playerHealth = playerHealth - pendingDamage;

        if (playerHealth <= 0)
        {
            KillPlayer();
        }
        else //EP19追加
        {
            player.playerUIManager.DisplayHealthPopUp();
        }
    }
}

プレイ動画です。
youtu.be

今回は以上です。