LoginSignup
0
0

UniRx入門②(IReadOnlyReactivePropertyとLINQ)

Posted at

はじめに

前回は、スペースキーを押したら回数をカウントするシステムを作成しました。
今回は、IReadOnly というものを作成し、ReactivePropertyを少し改良します。
(動けばいいだけなら、重要ではないかもしれません。)

IReadOnlyReactivePropertyについて

前回のコードでは、他のプログラム(クラス)でもReactivePropertyの値を変更することができました。しかし、スペースキーの入力を検知するプログラム以外で、値を変更できる状態だと問題が起こるかもしれません。そのため、外部から値を参照することはできるが、代入できないプログラムに変更します。

SpaceSystem.cs
    //ReactiveProperty<型(int, float,stringなど)を宣言>
    //今回は回数を数えたいのでint型
    //new ReactiveProperty<int>(),にある()に初期値を代入できる(今回は初期値0を代入)。

    //publicをprivateに変更<今回の変更点>
    private ReactiveProperty<int> spaceCount = new ReactiveProperty<int>(0);

    //下のコードを追加、内容はコメントアウト部分と同じ<今回の変更点>
    public IReadOnlyReactiveProperty<int> SpaceCount => spaceCount;
    /*
    public ReactiveProperty<int> SpaceCount
    {
        get { return spaceCount; }
        private set { spaceCount = value; }
    }*/


    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            //ReactivePropertyを使う際には変数名.Value(_spaceCount.Value)を用いる
            spaceCount.Value++;
        }
    }
SpacePresenter.cs
public class SpacePresenter : MonoBehaviour
{
    [SerializeField] private TextMeshProUGUI spaceCountText;
    [SerializeField] private SpaceSystem spaceSystem;

    private void Start()
    {
        //SpaceSystemのSpaceCountの数字が変化した時にSubscribe以下(textの変更)を実装する。
        //spaceSystem.spaceCountをspaceSystem.SpaceCountに変更する<今回の変更>
        spaceSystem.SpaceCount.Subscribe(x => spaceCountText.text = $"{x}Click").AddTo(this);
    }
}

これによって、SpacePresenterがクリックの回数を変更できなくなりました。

public,readonly,privateのイメージ

 privateのイメージ

  • GoogleDocumentが共有されていない(URLがわからない)

 readonlyのイメージ

  • GoogleDocumentが共有されており、見ることが可能
  • GoogleDocumentが閲覧のみになっており、文字や値を変更できない

 publicのイメージ

  • GoogleDocumentが共有されており、見ることが可能
  • GoogleDOcumentが編集可能になっており、文字や値を変更できる

LINQについて

今回は、SpaceCountの最大値を決定し、それ以降カウントされないようにします。
そのためにLINQのWhereというものを使います。
Whereは()内の条件を満たす場合のみを通過し、条件を満たさない場合はWhere以降の処理は実行されません。

SpacePresenter.cs
public class SpacePresenter : MonoBehaviour
{
    [SerializeField] private TextMeshProUGUI spaceCountText;
    [SerializeField] private SpaceSystem spaceSystem;
    //<今回の追加>
    [SerializeField] private int maxCount = 30;
    private void Start()
    {
        //SpaceSystemのSpaceCountの数字が変化した時にSubscribe以下(textの変更)を実装する。
        spaceSystem
            .SpaceCount
            //xはspaceCountである<今回の追加>
            //xがmaxCount以下ならSubscribeする.xがmaxCountより大きいならSubscribeされない。
            .Where(x => x <= maxCount)
            .Subscribe(x => spaceCountText.text = $"{x}Click").AddTo(this);
        
    }

}

この実装によって、カウントがmaxCountより大きくならなかった場合は成功です。
LINQはWhere以外にもSelect,Any,ToArrayなど様々なものがあるので、用途に応じて使い分けてください。

最後に

readonlyは基本的にはpublicで公開せずに、readonlyで読み取り専用として実装した方が良いと個人的には思います。UniRxはWhereとToArrayをよく使う気がします。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0