Unity UniRxをつかってスワイプでカメラ移動をしてみた
UniRxをAssetsストアから落としてきます。
アセット検索すれば出てきます。
パネルを用意する
今回わかりやすいように色をかえてみましたが
特に意味はありません。
カメラの位置を決定する
斜め45℃下を向くカメラを置き、パネル全体が写るように調整します。
カメラにRigidBodyを追加する。
適当なオブジェクトに下記スクリプトをアタッチする
名前は適当にCameraMove.csにしました。
MainCameraにカメラをタッチします。
using UnityEngine; using System.Collections; using System; using UniRx; public class CameraMove : MonoBehaviour { //メインカメラ public Camera MainCamera; // FixedUpdate void FixedUpdate () { // マウスが押された場合 if (Input.GetMouseButtonUp(0)) { } else if (Input.GetMouseButton(0)) { MapSwipe(); } } //スワイプの処理 public void MapSwipe() { //mousePositionの取得 var drug = Observable.EveryUpdate ().Select (pos => Input.mousePosition); //クリックが話されたら購読停止 var stop = Observable.EveryUpdate ().Where(_ => Input.GetMouseButtonUp(0)); //マウスポジションの4フレーム後のポジションを比較してカメラのRigidbodyに力を加える。 IDisposable onDrug = drug.Zip (drug.Skip (4), (pos1, pos2) => new {x = pos2.x - pos1.x, z = pos2.y - pos1.y}) //クリックが話されたら購読停止 .TakeUntil(stop) .Subscribe (deltaPosition => { MainCamera.gameObject.GetComponent<Rigidbody>().velocity = new Vector3(deltaPosition.x, 0, deltaPosition.z) * -5; } ); } }
いい感じにうごきました、がブログ用に抜粋して書いたのでちょっといびつですね。
実際はupdate内で状態管理したりすると思います。
稼働領域の限界値はSubscribe内に書くと慣性の力で限界値よりも動いてしまう場合があるので
それはupdate内で監視しておいた方がいいかもしれません。
また、購読完了はTakeUntilでやりましたが、実際に使う場合は
停止は停止でSubscribe呼び出してその中でステート変更などを行うのが良いでしょう。
次は似非ピンチイン、ピンチアウトでも作成しようかと思います。
--- 追記
上記スクリプトはエディター専用で実機の場合は別途対応が必要になります。
面倒くさがらずにあるなら書けやと言われそうなので下記に記載しておきます。
参考までにどうぞmm
using UnityEngine; using System.Collections; using System; using UniRx; public class CameraMove : MonoBehaviour { //メインカメラ public Camera MainCamera; // FixedUpdate void FixedUpdate () { #if UNITY_EDITOR // マウスが押された場合 if (Input.GetMouseButtonUp(0)) { } else if (Input.GetMouseButton(0)) { MapSwipe(); } #elif UNITY_IOS || UNITY_ANDROID if (Input.touchCount == 0) { } else if (Input.touchCount == 1) { MapSwipe(); } #endif } //スワイプの処理 public void MapSwipe() { #if UNITY_EDITOR //mousePositionの取得 var drug = Observable.EveryUpdate ().Select (pos => Input.mousePosition); //クリックが話されたら購読停止 var stop = Observable.EveryUpdate ().Where(_ => Input.GetMouseButtonUp(0)); #elif UNITY_IOS || UNITY_ANDROID //positionの取得 var drug = Observable.EveryUpdate ().Select (pos => Input.GetTouch(0).position); //タッチカウントが変更され場合に購読停止 var stop = Observable.EveryUpdate ().Where(_ => Input.touchCount != 1); #endif //マウスポジションの4フレーム後のポジションを比較してカメラのRigidbodyに力を加える。 IDisposable onDrug = drug.Zip (drug.Skip (4), (pos1, pos2) => new {x = pos2.x - pos1.x, z = pos2.y - pos1.y}) //クリックが話されたら購読停止 .TakeUntil(stop) .Subscribe (deltaPosition => { MainCamera.gameObject.GetComponent<Rigidbody>().velocity = new Vector3(deltaPosition.x, 0, deltaPosition.z) * -5; } ); } }
ご意見マサカリ等歓迎しております!