#はじめに
以前キー入力、マウス入力をIObservableに変換して使うという記事を書きました。
このライブラリはInputを流すストリームを作るものでしたが、いまいち使い道が思い浮かばなかったのですが、
Inputを分岐してくれる機構があれば便利かなと思いました。
と思っていたらUnityでInputの分岐器を作った話という記事を見つけました。そうです、やりたいことはこれです。
ということで前回のInputAsObservableを使って楽に作れるんじゃないかということで作ってみました。
更新
・2020/02/09
Brancherという単語がおかしいってことで名前を「InputSwitcher」として新しいリポジトリを作りました。
クラス名も長かったのが何となく嫌だったので「InputSw」としました。
名前空間とクラス名が変わっただけで機能は同じですが、更新は今後こっちでします
InputSwitcher
#用意するもの
UniRx
InputAsObservable
InputBrancher
#使い方
##①Interfaceの実装
Inputの流す先のクラスにIInputReceiverインターフェースを実装します(空のインターフェースです)
using InputBranch;
using UnityEngine;
using UniRx;
public class Hoge : MonoBehaviour,IInputReceiver{
void Start(){
InputBrancher.GetKey(this, KeyCode.C)
.Subscribe(_ => {Debug.Log("Hoge");}); //Cをおすとほげええええ
}
}
using InputBranch;
using UniRx;
using UnityEngine;
public class Foo : MonoBehaviour,IInputReceiver{
void Start(){
InputBrancher.GetKey(this, KeyCode.C)
.Subscribe(_ => {Debug.Log("Foo");}); //Cを押すとふううううう
}
}
##②分岐方法を決定
InputBrancher.Switch(IInputReceiver)メソッドでどのインスタンスのインプットを受け取るかを決めます。
例ではHを押したときとFを押したときで分岐させています。
using InputBranch;
using UniRx.Triggers;
using UnityEngine;
using UniRx;
public class SampleInputController : MonoBehaviour{
[SerializeField] private Hoge hoge;
[SerializeField] private Foo foo;
private void Start(){
this.OnKeyDownAsObservable(KeyCode.H)
.Subscribe(_ => {
Debug.Log("switch hoge");
InputBrancher.Switch(hoge); //Hを押したらhogeのインプットしか受け取らない
});
this.OnKeyDownAsObservable(KeyCode.F)
.Subscribe(_ => {
Debug.Log("switch foo");
InputBrancher.Switch(foo); //Fを押したらfooのインプットしか受け取らない
});
}
}
インプットを分岐することができ、同じCキーを押したときでもインスタンスによって結果が変わりました。
#利点
InputBrancherを介することでインプットを分岐することができ、結果をイベントで受け取るのでUpdateにif文で判定を書くことを撲滅できます。
#欠点
単にboolやflootで値が欲しいときに対応できない。(それ用のメソッドをまた作らないと…)