タワーデフェンスゲーム　Unity　敵の機能　8/10 aボタンを押すとHPバーが減少するように実装

# 概要
前回の続きです。

https://qiita.com/RYA234/items/7a606fc8b879a4032a1b


今回はaボタンを押すと敵のHPが減少する処理を実装します。
以下gifアニメはキーボードのaボタンを二回押したときの様子です。

![HeatlhReduce.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/90db3fd8-9c80-4435-fd55-61fbf323fc00.gif)

次へ

https://qiita.com/RYA234/items/34c1a2eaa069691f58c6

# 開発環境

IDE:Rider
Unity:2020.3.42(LTS)
OS:Windows10

# UnityEditor上の設定

## HPバー
EnemyHealthContainerスクリプトをアタッチします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/4346b812-f030-bc59-c403-554f96a1df1b.png)



# 実装のポイント
新規にEnemyHealthContainerクラスを作成します。
役割としては、HPバーのImageオブジェクトをEnemyObjectにアタッチされているEnemyHealthクラスに渡すことです。

EnemyHealthクラスはaボタンを押した時にHPが減る処理を追加します。
UI的にはImage.fillAmountを使ってHPの減少を表現しています。


# コード部分
```diff_c_sharp:EnemyHealthContainer.cs
using UnityEngine;
using UnityEngine.UI;


public class EnemyHealthContainer : MonoBehaviour
{
    [SerializeField] private Image fillAmountImage;
    public Image FillAmountImage => fillAmountImage;
    

}



```

```diff_c_sharp:EnemyHealth.cs
using System.Collections;
using System.Collections.Generic;
+ using System.ComponentModel;
using UnityEngine;
+ using UnityEngine.UI;

public class EnemyHealth : MonoBehaviour
{
    // Start is called before the first frame update
    [SerializeField] private GameObject healthBarPrefab;
    [SerializeField] private Transform barPosition;

    [SerializeField] private float initialHealth = 10f;
    [SerializeField] private float maxHealth = 10f;

+    public float CurrentHealth { get; set; }
+    private Image _healthBar;
    void Start()
    {
        CreateHealthBar();
+        CurrentHealth = initialHealth;
    }

+    private void Update()
+    {
+        if (Input.GetKeyDown(KeyCode.A))
+        {
+            DealDamage(5f);
+       }
+
+        _healthBar.fillAmount = Mathf.Lerp(_healthBar.fillAmount, CurrentHealth / maxHealth, Time.deltaTime * 10f);
+    }

    private void CreateHealthBar()
    {
        GameObject newBar = Instantiate(healthBarPrefab,barPosition.position,Quaternion.identity);
        newBar.transform.SetParent(transform);
        
+        EnemyHealthContainer container = newBar.GetComponent<EnemyHealthContainer>();
+        _healthBar = container.FillAmountImage;
    }

+    public void DealDamage(float damageReceived)
+    {
+        CurrentHealth -= damageReceived;
+    }
}



```


# 参考

fillAmount

https://docs.unity3d.com/ja/2018.4/ScriptReference/UI.Image-fillAmount.html

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/595af208-889a-f7c6-654a-3d3baac21836.png)

ラムダ式

https://www.ipentec.com/document/csharp-operator-equal-grater-than

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/5dafce1a-00c3-e7c4-693b-b839a7cd7b9f.png)




Section4 16

https://www.udemy.com/course/learn-how-to-create-a-2d-tower-defense-game-in-unity-2020/learn/lecture/22979824#content

github コミット分

https://github.com/RYA234/2DTowerDeffenceMyLearning/commit/14f20a71a734de3a0ba780609a1f4608b918bbb0#diff-9dd4279729c4b8f4a628d9e1f3785092823c1c408344a7feeaad825ebb6ab783

章まとめ

https://qiita.com/RYA234/private/6d878a7958a3c760c8af