みんなRxだいすき?ぼくはだいすきです
だいすきなRxでピンチイン・アウトをシンプルに使いやすくサクッと書きたかった
たぶん書けた
Rxじゃない書き方はこんな感じになります
Unityでピンチイン・ピンチアウトを実装する
#ソース
PinchEventHandler.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UniRx;
using UniRx.Triggers;
public class PinchEventHandler : MonoBehaviour
{
private Subject<float> onPinch = new Subject<float>();
public IObservable<float> OnPinch { get { return onPinch; } }
void Start()
{
//ピンチ終了
var multiTapEndStream = this.UpdateAsObservable()
.Where(_ => !MultiTapping());
//ピンチ
this.UpdateAsObservable()
.Where(_ => MultiTapping()) //2箇所以上タップされている
.Select(_ => GetMultiTapDistance()) //2点間の距離にメッセージを変換
.Buffer(2, 1) //バッファに詰める
.Select(distances => distances[1] - distances[0]) //前フレームとの距離の差にメッセージを変換
.TakeUntil(multiTapEndStream) //ピンチ操作が終わったらバッファをクリアにする(TakeUntil+RepeatUntilDestory)
.RepeatUntilDestroy(this)
.Subscribe(delta =>
{
onPinch.OnNext(delta);
});
}
private bool MultiTapping()
{
return Input.touchCount >= 2;
}
private float GetMultiTapDistance()
{
return Vector2.Distance(Input.GetTouch(0).position, Input.GetTouch(1).position);
}
}
タップしている2点間の距離をバッファに詰めて、差分をOnNextで流しています
.Buffer
が超便利なお陰で、一時保存用のグローバル変数が消え去ってスッキリ
使う時には
sample
var pinchMultiply = 0.001f; //適当に調整するなりしてください
pinchEventHandler.OnPinch
.Subscribe(pinchDistanceDelta =>
{
//ピンチで拡大・縮小
transform.localScale += (pinchDistanceDelta * pinchMultiply) * Vector3.one;
})
.AddTo(this);
こんな感じでどうぞ
#結論
UniRxはいいぞ