Unity3D

オレオレInputModuleの作り方

More than 3 years have passed since last update.


目的

標準のInputModuleでは、複数のドラッグを同時に行った際のpositionが

それぞれのドラッグの中点になってしまうという仕様(?)がある。

そのため、バーチャルスティック2つなどを作ろうとするとうまく動かないため

InputModuleを自作して多重ドラッグに対応させる。


  • ちなみに、ドラッグの中点になってしまう仕様については以下の2点を満たすときのみ発生するようです。

    つまり、今回作ったオレオレInputModuleはいらない子・・・


    • mousePosition を参照している。

    • simulateMouseWithTouches が true




概要


やったこと


BaseInputModuleを継承したクラスを作る

public class DragInputModule : BaseInputModule {

public override void Process(){}
}


EventSystemというGameObject(uGUIを作成すると勝手に作られるオブジェクト)に

上記のコンポーネントを付ける


Process()内でInput.Touchesの状態を見つつドラッグの開始/ドラッグ中/終了の状態を判定する(コード割愛)


送り先のメソッドを定義したインターフェースを作成


送るパラメータを定義する


送る対象を検索する



  • 検索用にPointerEventDataを用意する



    • eventSystem は BaseInputModule の時点で定義されている

      var data = new PointerEventData( this.eventSystem );
      
      data.position = beginPoint;
      data.delta = Vector2.zero;
      data.scrollDelta = Vector2.zero;





  • 検索処理



    • m_RaycastResultCache は (以下同文)

      this.eventSystem.RaycastAll( data, m_RaycastResultCache );
      
      var target = this.FindFirstRaycast( m_RaycastResultCache );
      m_RaycastResultCache.Clear();




  • 今回の場合はドラッグ開始地点のtargetをキャッシュする必要があったのでGetComponentで取っておいた。


target.gameObject.GetComponent<IOriginalHandler>();


ターゲットに向けてデータを配信する

target.OriginalEvent( OriginalData );


イベントを受け取る


  • 自作のインターフェースを継承したコンポーネントを作成する(コード割愛)


Process()とUpdateModule()


  • Process()で処理を実行していたが、毎フレーム呼び出されているわけではない模様


    • 何か実装方法が悪いのかもしれないが、UpdateModule()だとうまくいっているのでそれで実装をすすめている。


      • インターフェースを直接触っているので問題がないだけかもしれない。





  • リファレンス




simulateMouseWithTouches


参考