スポンサーリンク

iOS開発

【SpriteKit】SKNodeタッチ検知の不具合を回避する方法

【SpriteKit】SKNodeタッチ検知の不具合を回避する方法

SKNodeのプロパティuserInteractionEnabledはデフォルトでNOになっており、ボタンなどのパーツのみ、このプロパティをYESにしてタッチを検知させます。

ノード階層に従い、重なり順が上にあるノードからタッチを検知し、先のプロパティをYESに設定しない限り、ノードはタッチ検知から無視されるのが正常な動作であるはずです。

ところが、現時点では、このタッチ検知が正しく動作していないようです。
(2015/03/05時 XCode6.1.1)

現象1: 表示上のノード階層とタッチ検知が一致しない

ノード階層では下にあるはずのノードがタッチ検知してしまう。
※全てのノードにzPositionを明示的に指定すると正しい検知になる?

現象2: 無視されるはずのノードがタッチ検知を遮る

userInteractionEnabledがNOのノードを無視してくれない。
かといって、そのノードのタッチメソッドが呼ばれるわけでもない。
ただタッチ検知を遮るだけ。

現象3: iPhone4s(実機)でのみ確認した不思議な現象

userInteractionEnabled がNOのノードが、タッチを遮ったり、遮らなかったりする。
※iPhone4sの実機でのみ現象を確認。

このSKNodeのタッチ検知順に関する問題は、どうやらSpriteKitのバグであるらしく、根本的な解決は将来のバージョンアップで解決されることを待つしかありません。

TouchPriorityカテゴリを読み込んで解決

しかし、この問題を回避するため、SKSceneのタッチメソッドをオーバーライドするテクニックが公開されています。

>>[GitHub Gist] bobmoff/TouchPriority.h

こちらで提供されているカテゴリ「TouchPriority」を読み込んでおけば、ノード階層に従った、正しいタッチ検知が動作します。

【参考】

以下のサイトを参考にさせていただきました。ありがとうございます。

Sprite with userInteractionEnabled set to YES does not receive touches when covered by normal sprites

スポンサーリンク