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