概要
個人的な経験ですが 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 件のコメント:
コメントを投稿