はじめに
前回は、スペースキーを押したら回数をカウントするシステムを作成しました。
今回は、IReadOnly というものを作成し、ReactivePropertyを少し改良します。
(動けばいいだけなら、重要ではないかもしれません。)
IReadOnlyReactivePropertyについて
前回のコードでは、他のプログラム(クラス)でもReactivePropertyの値を変更することができました。しかし、スペースキーの入力を検知するプログラム以外で、値を変更できる状態だと問題が起こるかもしれません。そのため、外部から値を参照することはできるが、代入できないプログラムに変更します。
//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++;
}
}
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以降の処理は実行されません。
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をよく使う気がします。