UniRxを勉強しよう4

さてさて!
前回までで押されたボタンの値は取得できるようになったので、今日は4.を進めていく。

完成までの流れ

1. まずは簡単に見た目だけ作る
2. ボタンを押下した際にこれを検知する
3. 押下されたボタンから数値や記号を取得する
4. 引数に渡された数値がディスプレイに表示されるようにする
5. 検知した数値や記号から四則演算を実施できるようにする
6. 見てくれを整える
7. 書き出す

その前に練習で作った処理から要らんところを消す

ここではどこを消したか分かりやすいようコメントアウトで記しておく。

    void ButtonCheck(int i)
    {
        buttons[i].onClick.AsObservable()
            //.Select(_ => 1)
            //.Scan(0, (element, aba) => element + aba)
            .Subscribe(count =>
            {
                Debug.Log(texts[i].text);
            })
            .AddTo(gameObject);
    }

イベントを取得さえできればいいので、Selectによる変換とScanによる値の編集は不要だ。
今回はここから別のところにOnNextでメッセージを飛ばすように作り変えたいと思う。

PassPushedButtonからShowDisplayへ取得したキーをパスする

めっちゃ大変だったができた...途中WindowsUpdateが挟まったせいで死ぬかと思った…

一つ目のPassPushedButtonは以下のように変更。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UniRx;
using System;
using UnityEngine.UI;
using System.Security.Cryptography.X509Certificates;

public class PassPushedButton : MonoBehaviour
{
    [SerializeField] List<Button> buttons;
    [SerializeField] List<Text> texts;

    //このクラスからOnNextで別クラスに処理を渡せるようSubjectを用意
    private Subject<string> sendCalcSubject = new Subject<string>();
    
    //なんだっけこれ…プロパティ?外部クラスからアクセス(getのみ)できるようにしておく
    public IObservable<string> KeyClicked
    {
        get { return sendCalcSubject; }
    }

    // Start is called before the first frame update
    void Start()
    {


    }

    // Update is called once per frame
    void Update()
    {

    }

    void Awake()
    {
        for (int i = 0; i < buttons.Count; i++)
        {
            ButtonCheck(i);
        }
    }

    void ButtonCheck(int i)
    {
        buttons[i].onClick.AsObservable()
            .Subscribe(count =>
            {
                Debug.Log(texts[i].text);
                //定義したSubjectからOnNextでメッセージを出す
                sendCalcSubject.OnNext(texts[i].text);
            })
            .AddTo(gameObject);
    }
}

そしてここから発されたメッセージを受けてディスプレイに表示させるためのクラスは下記のように作った。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UniRx;

public class ShowDisplay : MonoBehaviour
{
    //メッセージのやりとり対象はInspector画面から設定する。
    [SerializeField] private PassPushedButton passPushedButton;

    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        
    }

    void Awake()
    {
        //監視対象スクリプトからOnNextが飛んで来たら下記Subscribe処理を実行
        passPushedButton.KeyClicked.Subscribe(KeyCode => Debug.Log("SD" + KeyCode));
    }
}

一旦はOnNextで飛ばされてきたメッセージを取得するだけにした。

VisualStudio2019でスクリプトを書いているのだが、名前空間UniRx内のものをしようとすると全部赤い波線が出るのでデバッグが大変だった。勘弁してくれマジで。

以下記事のサンプルコードをパクり、今回自分がやりたいことに合わせて修正をした。
qiita.com