Galaxy Noteでのみ、しかもタッチペンを使ったときのみ描けなくなるというバグ

私のリリースしているお絵かきアプリのユーザーさんから、タッチペンを使うときだけ絵が描けないという報告を受けました。調べていくと、奇妙な現象でして、

  • 指では描ける
  • タッチペンを使った場合でもボタン等は反応する
  • 自分の手元にあるiPadや他のタブレットでは問題ない

調べてみると、以下のような投稿をForumで見かけました。

https://forum.unity.com/threads/android-pen-not-working.766508/?fbclid=IwAR2on-iHh1uE4cLJLd9Q1QKJfkXfDjCCDRP1arC3r__geryCtpbCVhw9UiE

どうもGalaxy Note特有の現象なようです。

Unity側で対処すべき問題なのかGalaxy Note側の問題なのかは分からないのですが、とにかく不具合なことは確かです。

issuetracker.unity3d.com


こちらを見ると1月中旬に修正が入ったそうですが、自分の使っているUnity2018.4.15fでビルドしたバージョンでは未だに発生するようでした。

仕方がないので先のフォーラムに書いてあったワークアラウンドを試してみたところ解決できました。

ワークアラウンドというのは見えないUIレイヤーを一つ挟んでそこでタッチとタッチポジションを検知するというもの。

ざっくりこういう感じのコンポーネントを作って、このisPointerDownやpointerPositionをInput.GetMouseButton( 0 )やInput.mousePositionの代わりに使うことで解決できました。

2020/3/6 修正
以前のIDragHandlerを使うバージョンだと僅かな移動の場合にポジションが更新されなかったのでpositionは、Input.mousePositionで取ることにして、downしたかどうかだけをOnPointer関数で取得することにしました。

public class UILayer : IPointerDownHandler, IPointerUpHandler {
    public bool isPointerDown;
 
    //------------------------------------------------------------------------------
    public void OnPointerDown(PointerEventData pointerEventData)
    {
        isPointerDown = true;
    }

    //------------------------------------------------------------------------------
    public void OnPointerUp(PointerEventData pointerEventData)
    {
        isPointerDown = false;
    }
}