雑学豚の巣穴

盛大なメモ帳

例えば残存HPと画面の表示の関係

数字表記とHPバーがあってダメージ受けたら減らしたいよね

 

内部では数値として持っていて、

画面に表示する数字表記はテキストで、

画面に表示するHPバーの長さにも反映させなきゃいけなくて、

 

 

ダメージと追加効果持った火球がプレイヤーに当たったらダメージ関数に数値を渡して

渡ってきた数値から処理はプレイヤーで行うとして

HPはプレイヤーが持ってるからいいとしても

「画面に表示されてるもの」という物体をプレイヤーが触りに行くのはちょっとなーだし

画面が常にプレイヤーのHPを監視して表示を変えるのもなんだかなーだし

欲しいのはHPの値が変わった瞬間だけなんだけど

HPが変わったよ!と教える方法は無いものか

 

変わった?変わってない。変わった?変わってない。を毎フレームごとやるのが嫌なんじゃ…

 

System.ComponentModelにINotifyPropertyChangedってのがありますやんか

Property…Changed…可能性がありそうだけど難しそう…難しそうじゃない?

やりたいのは値変えられたら設定された関数呼びたいだけなんや

 

そんなあなたにSystem直下のやべーやつ

System.Actionである

キーワードはActionとラムダ式だ!


    //「画面に表示されてるもの」用のスクリプト
    
    public void hpChange()
    {
        hpText.text = 
        PlayingManager.instance.hp.ToString() 
        + " / "
        + PlayingManager.instance.max_hp.ToString();
    }

 

単純に言えばHP変更されたらこれが呼ばれたい訳よ

でもHPはPlayingManagerというゲームの基礎の数値持ってる所にあって変更されたかどうかは「画面に表示されてるもの」側で確認が難しいと。

そこで出てくるのがActionクラス

 

まず値変更監視用のクラスを作り、そのクラスに値とAction変数を持っておきます

ジェネリッククラスにより好きな型を値にしとけば汎用性高いけど別に整数型でもいいです


public class 監視クラス<T>
{
    private T val;

    public T Value
    {
        get
        {
            return val;
        }
        set
        {
            val = value;
            //変更されたよ(val); //真に変更されたよルート行くなら値設定前にvalとvalue比較しよね
        }
    }
    public Action<T> 変更後に行きたいやつ; //どうせsetで値貰えてるんだから引数ありでやろう
}

 

このクラスを使ってPlayingManagerでhpを宣言・管理しますよ

 

「画面に表示されてるもの」側でPlayingManagerのHPにある変更後に行きたいやつに関数を設定します。こういうの名前適当につけがち。

PlayingManager.instance.hp.変更後に行きたいやつ += value => hpChange();

 

 

最後に監視クラスに変更されたよを実装

    private void 変更されたよ(T val)
    {
        var 行きたいの = 変更後に行きたいやつ;
        if (行きたいの == null)
        {
            return;
        }
        行きたいの(val);
    }

 

 

こんな感じでHP変更された管理とテキスト変更連動!

チカレタ…

今回真面目すぎひん?