残りのエネルギーによって色を変える(プロパティの使い方)

今回のサンプルでは、オブジェクトのエネルギーの数値によってオブジェクトの色が変えられるようにします
しかし、ただ変えるのではなく、床に接触したらエネルギーが10減って残りのエネルギーの数値によって色が変わるようにしてみます

エネルギーの数値とオブジェクトの色の関係

エネルギーと色の関係は次のようにしましょう

  • エネルギ−は100より大きな値をセットしようとしてもできない
  • エネルギーが70より大きいと青色
  • エネルギーが30より大きいと黄色
  • エネルギーが0以上だと赤色

実行した様子

ボールが落下して床に接触したら10エネルギー減って、結果から色が変わります

接触前の値を60にしておきます
接触すると10減りますので、50になります
条件から、黄色に変化するはずです

シーンの構成

床(Cube)

ボールの接触があれば、アタッチされたスクリプトが実行されます

ボール(Sphere)

自然落下させるためにRigidbodyコンポーネントもアタッチされています

設計

概要

アプリケーションが実行されると、ボールが上から落下(自然落下)してきて床に落ちます
床に落ちるとボールのエネルギーが10減ります
エネルギーの数値によりボールの色が変化します

名刺抽出法

名詞、名詞句

ボール、床、オブジェクトの色、エネルギー値

動詞、動詞句

床に落ちる、エネルギーが減る、色が変わる

クラス(スクリプト)候補

TestBall(ボールオブジェクトにアタッチ),Floor(床オブジェクトにアタッチ),Enegy(ボールの変数)

メソッド候補

OnCollisionEnter(接触時のイベント:床オブジェクトのFloorスクリプトに記述)、エネルギーが減るのはエネルギーを減算することで実現、色が変わるのはエネルギーの値を自動的にチェックして変更させる

スクリプト

ボールのエネルギーの値を変える、また、ボールの色を変えるきっかけ(イベント)は、床にあります
床のイベントが発生したらどのような処理にするのか、簡素に実装するのがコツです

床にアタッチするスクリプト

床にボールが接触すると、OnCollisionEnterイベントが実行されます
接触したゲームオブジェクトを取得して、TestBallスクリプトのEnegy値を10減らしています
接触したボールの色はここでは変えていないことに注意してください
ボールのエネルギーの値だけが見えています
ボールの他のことを気にする必要はありません

using UnityEngine;

public class Floor : MonoBehaviour
{
    void OnCollisionEnter(Collision collision)
    {
        collision.gameObject.GetComponent<TestBall>().Enegy -= 10;
    }
}

TestBall(ボールオブジェクトにアタッチするスクリプト)

プロパティを使っています
エネルギー値を変更されたタイミングで、色も変えています
呼び出し元では、色を変える処理を記述する必要がありません
呼び出し元では、ただ、エネルギー値を変えるだけでいいです
つまり、呼び出し元では、ボール自身の色の面倒を見る必要がないようにしています
ボールの振る舞い(動作)は、ボール自身で頑張って処理してもらいましょう

Enegyプロパティに値を代入するとSetが呼び出されます
代入される値は、value変数(C#で予約されています)に代入されていますので、これを使って条件分岐を実装しています。あたかもメソッドのブロックのようですね

using UnityEngine;

public class TestBall : MonoBehaviour
{
    Material material;

    [SerializeField]
    int enegy = 10;

    public int Enegy
    {
        get
        {
            return enegy;
        }
        set
        {
            if (value > 100)
            {
                enegy = 100;
                material.color = Color.blue;
                return;
            }
            else if (value > 70)
            {
                material.color = Color.blue;

            }
            else if (value > 30)
            {
                material.color = Color.yellow;
            }
            else if (value >= 0)
            {
                material.color = Color.red;
            }
            else
            {
                enegy = 0;
                material.color = Color.red;
                return;
            }

            enegy = value;

        }
    }

    private void Awake()
    {
        material = GetComponent<Renderer>().material;
    }
}

考えてみましょう

次のように誤った値が代入されるとどうなるでしょう
Ballオブジェクトの値が正常値に抑えられているでしょうか
Ballオブジェクトが自分で自分のことを守っているように見えますか
そう見えたら、オブジェクト指向のカプセル化の理解が近づきます

  • energyに150をセットするとどうなるでしょう?
  • energyに-50をセットするとどうなるでしょう?

参考

Unity

Posted by hidepon