概要

諸般の都合でNGUIを使ってるプロジェクトでプログラムから座標を指定してタップ処理をコールする処理を作りました

・ゲーム内にカーソルを用意したい場合

・UIの自動テストをしたい場合

で利用できるかもしれません

 

まあ今更NGUI使う人はいないですよね

uGUIも似たような実装になってるの?機会があればコード読みます

 

検証環境

Unity: 2018.4.26f1

NGUI: 2019.3.0

実装

UICamera.csに以下を追記します

public void VirtualProcessTouch(Vector2 pos, bool pressed, bool unpressed)
{
    currentTouchID = 1;
    currentTouch = GetTouch(currentTouchID, true);
    currentTouch.touchBegan = pressed;
    if (pressed)
    {
        currentTouch.pressTime = RealTime.time;
        activeTouches.Add(currentTouch);
    }
    currentTouch.delta = pos - currentTouch.pos;
    currentTouch.pos = pos;
    currentKey = KeyCode.None;
    currentTouch.clickTime = RealTime.time;

    Raycast(currentTouch);

    ProcessTouch(pressed, unpressed);

    currentTouch.last = null;
    currentTouch = null;
}

あとは呼びたいところでVirtualProcessTouchをコールすればOKです

ツールチップやドラッグ処理をしたい場合はマイフレームコールする必要があるので注意。

 

解説

NGUIのUIへのタップ処理はUICameraで実装されています

Update関数からコード読むといいです

Update - ProcessEvents - ProcessTouches でタッチ処理が実装されてるのでコピぺしました

ちなみにRaycastは何もしてなくても全UICameraから毎フレーム飛ばしてます。

 

おまけ1

ProcessOthersにコントローラーを想定した処理がありますがUIKeyNavigationのための実装です。

これをボタンに設定しておくと十字キーでどのボタンに移動するか定義できるんですね。便利。
 

おまけ2

最初、自分でカメラからRaycastして要素を全取得してタップ処理をコールしようとしましたが
座標とdepthで前後関係がちゃんと取れなかったりScrollViewの子要素がとれてしまったりで無理でした
結果UICameraをいじるのが早かったというオチ