i-school - 弾が当たるごとにブロックの色を変化させる
BOXの耐久力を視覚的に分かるようにするために、弾が当たるごとに色を変えるようにします。

https://gyazo.com/cdaaa65ee46cd48b59e97d170a8fbc05

https://gyazo.com/176e966356e8c57db0dcdc088787535c

新しいスクリプト「ChangeColorOnHit」を作成します。
Assetes -> Script フォルダ内で右クリックをして、create -> C# scriptを選択します。
ソースコードは下記の通りです。
using UnityEngine;

public class ChangeColorOnHit : MonoBehaviour
{
    //Hierarchyからカラーをセットするために配列を用意する
    public Color[] blockColors;

    /// <summary>
    /// ブロックの色を変更するメソッド。配列のSizeで指定した数が、色の変わる順番と内容になる
    /// </summary>
    /// <param name="index">ブロックの残りのHP</param>
    /// <returns></returns>
    public Color ChangeMaterialColor(int index) {
        //  indexは [Blockのhp - 1]の値を利用する
        index--;
        //  ブロックの色を配列に登録されているIndexの色に変更する
        return blockColors[index];
    }
}

 上記のChangeColorOnHitスクリプトをMainシーンのMasterゲームオブジェクトにアタッチします。
Masterゲームオブジェクトのインスペクターを確認して、ChangeColorOnHitスクリプトがアタッチされているか確認します。



 無事にアタッチされていると、BlockColors というColor型の配列のアサイン情報が表示されていますので、こちらのSizeを、Blockの持つ耐久力の内で最も高い値と同じ数字に設定します。
例えばBoxのHpが1、HardBoxのHpが3の場合には、このSizeを3に設定します。そうするとElement情報が追加されます。



 Sizeを指定すると画像のように色を設定する項目が表示されます。(初期値はすべて黒色) 各Elementには好きな色を登録してください。
この処理では、Elementの値と各BlockのInitHp(耐久力)の値とをリンクさせて、ブロックにボールが当たる度に色が変化するようにしています。
 
 


続いて、Destroyer.csの下記の場所に変更を加えます。

public class Destroyer : MonoBehaviour {

  (中略)

///* 宣言フィールドに2つ変数を追加 *///

    public Renderer rend;                 // ブロックの色の変更用
    private ChangeColorOnHit changeColorOnHit;    // 色を変更するクラスの情報を代入する変数

    void Start()
    {
        //Boxの耐久力を初期化(現在値=最大値にする)
        this.currentHp = initHp;

///* ここから追加 *///

        // masterObjの持っているChangeColorOnHitコンポーネントを取得して変数に代入して参照利用できるようにする
        changeColorOnHit = masterObj.GetComponent<ChangeColorOnHit>();

        // ブロックの色を残りの耐久力に合わせて変更する(ChangeColorOnHitクラスのChangeMaterialColorメソッドの戻り値としてColorをもらう)
        rend.material.color = changeColorOnHit.ChangeMaterialColor(currentHp);

///* ここまで *///

    }

    private void OnCollisionEnter(Collision collision)
    {
        (中略)

        //  まだ壊れない場合
        else
        {
            //  ボールを跳ね返すSEを再生
            AudioSource.PlayClipAtPoint(hitSE, transform.position); 

            // ブロックの色を変更      // <= 追加
            ChangeBlockColor();        // <= 追加
        }                                                               
    }

///* ここからメソッドを1つ追加 *///

   /// <summary>
    /// ブロックの色を残りの耐久力に合わせて変更する
    /// ChangeColorOnHitクラスのChangeMaterialColorメソッドに現在の耐久力の値を渡し、戻り値としてColor(色の情報)をもらう
    /// </summary>
    private void ChangeBlockColor() {
        rend.material.color = changeColorOnHit.ChangeMaterialColor(currentHp);
    }

///* ここまで *///

}

 スクリプトを修正しましたら、BoxプレファブとHardBoxプレファブのインスペクターを確認します。(他にもBoxのプレファブを作成している場合にはそれらも)
Rend という変数がアサイン情報として追加されていますので、そちらにBoxプレファブ自身の持つ MeshRenderer コンポーネントをアサインします。
これを各Boxのプレファブで同じように設定してください。

https://gyazo.com/b85f8daf6267f3343f7c804cc8b351a6

 以上で準備は完了です。ゲームを実行してみてください。スタート時に各ブロックの色が自分の耐久力の値に合わせて変化し、その後、ボールが当たる度に色が変化すれば成功です。