残りのエネルギーによって色を変える(プロパティの使い方)
今回のサンプルでは、オブジェクトのエネルギーの数値によってオブジェクトの色が変えられるようにします
しかし、ただ変えるのではなく、床に接触したらエネルギーが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をセットするとどうなるでしょう?
 






ディスカッション
コメント一覧
まだ、コメントがありません