4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Inputを分岐させる機構を作った

Last updated at Posted at 2019-09-14

#はじめに
以前キー入力、マウス入力をIObservableに変換して使うという記事を書きました。
このライブラリはInputを流すストリームを作るものでしたが、いまいち使い道が思い浮かばなかったのですが、
Inputを分岐してくれる機構があれば便利かなと思いました。
と思っていたらUnityでInputの分岐器を作った話という記事を見つけました。そうです、やりたいことはこれです。
ということで前回のInputAsObservableを使って楽に作れるんじゃないかということで作ってみました。

更新
・2020/02/09
Brancherという単語がおかしいってことで名前を「InputSwitcher」として新しいリポジトリを作りました。
クラス名も長かったのが何となく嫌だったので「InputSw」としました。
名前空間とクラス名が変わっただけで機能は同じですが、更新は今後こっちでします
InputSwitcher

#用意するもの
UniRx
InputAsObservable
InputBrancher

#使い方
##①Interfaceの実装
Inputの流す先のクラスにIInputReceiverインターフェースを実装します(空のインターフェースです)

Hoge.cs
using InputBranch;
using UnityEngine;
using UniRx;

public class Hoge : MonoBehaviour,IInputReceiver{
    void Start(){
        InputBrancher.GetKey(this, KeyCode.C)
               .Subscribe(_ => {Debug.Log("Hoge");}); //Cをおすとほげええええ
    }
}
Foo.cs
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を押したときで分岐させています。

SampleInputController.cs
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のインプットしか受け取らない
            });
    }
}

##結果
screenshot.1559356854.png

インプットを分岐することができ、同じCキーを押したときでもインスタンスによって結果が変わりました。

#利点
InputBrancherを介することでインプットを分岐することができ、結果をイベントで受け取るのでUpdateにif文で判定を書くことを撲滅できます。
#欠点
単にboolやflootで値が欲しいときに対応できない。(それ用のメソッドをまた作らないと…)

#余談
2019-09-15 (2).png
見逃してましたがRiderに怒られてました。Brancherって単語はないようですね!!

4
1
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
4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?