2019年12月5日木曜日

SKPhysicsBody を作成するときは極力 texture を使わないほうが良いと思う

概要

個人的な経験ですが SKPhysicsBody を生成するときは texture ではなくて circleOfRadius や rectangleOf を使ったほうが予期せぬ動作をしない印象があります
ハマった点などを紹介します

概要

  • macOS 10.15.1
  • Xcode 11.2.1 (11B500)

applyImpluse の挙動がおかしい

ある SpriteNode に対して物理エンジンを texture を使って作成しました
そして touchDown 時に applyImpluse を適用するような処理を実装したのですが iPhoneX 系の実機の場合挙動がおかしくなる現象が発生しました

シミュレータでやると問題ないのですが実機でやると力の入れ具合がおかしいのか本来のスピードよりも SpriteNode の動きが速かったり遅かったりしました
その度に端末のサイズごとの対応を入れていたのですが原因が texture によるものだとわかりrectangleOf で物理エンジン生成することで挙動がどの端末でも同じ動きをするようになりました

なぜ texture だとうまく動作しないのか明確な原因は不明ですがおそらく端末のサイズによるものかなと思います
小さい端末に比べて大きい端末の場合 texture 比率が小さくなると思います
おそらくそれにより質量などが端末ごとに変わってしまい力を与える applyImpluse の挙動もおかしくなってしまったのだと思います

SKPhysicsJointFixed の挙動がおかしい

指定したアンカーポイント同士で結合せず SpriteNode が重なったり逆に離れてジョイントするケースがありました
また本来は SpriteNode が上に重なるはずがなぜか texture を使っているとサイズが小さくなるのか上に乗らずに SpriteNode が重なってしまう現象も確認できました

これらの現象も texture ではなく rectangleOf を使って解決することができました

最後に

SKPhysicsBody を使う際のポイントを紹介しました
自分はなるべく rectangleOf を使うようにしています
特にゲームのコアとなる部分では texture は使わないようにしています

個人的に一番困ったのが texture を使うことによる端末ごとの挙動が異なる点でした
初めは SpriteKit の座標情報が実機とシミュレータで異なるのかなーと思っていたのですがそういうことはなく物理エンジンの作り方が悪かったというか物理エンジンの作り方に端末間で差異があるということがわかりました

もしかすると SpriteKit のバグで今後修正されることがあるかもしれませんが、それでも texture を使った当たり判定や結合処理などはやめたほうが無難かなと思います

0 件のコメント:

コメントを投稿