UniRxを勉強しよう6

はい!前回からコードに手を入れて、以下のようにディスプレイコードを書き換えた。

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

public class ShowDisplay : MonoBehaviour
{
    //メッセージのやりとり対象はInspector画面から設定する。
    public Text displayPanelText;
    [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
            //.Scan((pre, current) => pre + current)
            .Subscribe(KeyCode => ShowToDisPlay(KeyCode))
            .AddTo(gameObject);
        passPushedButton.OperaterKeyClicked
            .Subscribe(a => 
            {
                ShowToDisPlay("");
            })
            .AddTo(gameObject);
    }

    private void ShowToDisPlay(string value)
    {
        //演算記号が入力されたら一度ディスプレイをクリアする
        if(value == "")
        {
            displayPanelText.text = "";
        }
        //入力値が少数点でなければ先頭の0は消す
        else if(displayPanelText.text=="0" && value !=".")
        {
            displayPanelText.text = value;
        }
        else
        {
            displayPanelText.text += value;
        }
    }
}

これ期日が明後日(24日)なので巻いていかないといけないぞ!
今日は四則演算の処理を作っていく。演算はそれ用にクラスを設けたいと思っている。あとからクラスを見たときに「入力検知」「ディスプレイ表示」「演算処理」とはっきり役目を分けておきたいからだ。

電卓は以前作ったことがあるので、あれを思い出しながら作ってみたい。

完成までの流れ

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

演算処理のクラスについて少し考えてみる

演算処理について基本的な作りを考えてみる。…と、これまでフィーリングで作ってきたツケが回ってきたのでディスプレイ表示クラスについても再考してみた

ら、30分かかってもまとまらなかったのでフローチャートで考えてみることにした。
www.lucidchart.com
こちらのツールを使った。

*** 演算処理クラス

基本方針として、計算はすべてこいつの中で完結させたい。
ディスプレイから数値を取る必要はあるが、それ以外は独自にイベントを取得して独立して動けるようにしようと思う。

f:id:dkkng:20200723011527p:plain
演算処理クラスのフロー(仮)

上記のために必要なものとしては

  • 演算記号入力前にディスプレイ表示されていた値を格納する「変数1」
  • 演算記号を格納する「変数2」
  • ディスプレイから数値を取得する機能
  • ディスプレイの数値を書き換える(ためのイベントを発生させる)機能

あれ?意外と少ない?

*** ディスプレイ表示クラス

こいつの仕事はあくまで「表示」なので、ここからメッセージを送ったりはしない。
基本的には受け取ったものを表示するだけ。なのでイベントの受け口だけしっかり用意しておき、自分から外部の情報を参照したりはしないように作る。

とすると結構やることはシンプル。

  • ディスプレイ数値書き換えイベントを検知して、ディスプレイの値を変更する

これだけだ。

さて、文章量は少ないが結構時間がかかったので今日はここまで。明日は爆裂に進めるぞ!!