はじめに
こんにちは。
Unityでキャラを歩かせたとき、キャラが壁に当たった際にガクガクとめり込んでしまう問題が発生して困りました。
色々調べたところ解決方法がたくさん記載されていたのですが、どれをやっても解決には至りませんでした。
今回、たまたま原因と解決方法が判明したので記事に残します。
発生事象
発生した問題
キャラが歩いて壁にぶつかると・・
こんな風にキャラが壁にめり込んで戻る動きを繰り返してガクガクなってしまいます!
解決方法
キャラの移動を実装していたコードを、
Update()メソッドから、FixedUpdate()メソッドに変更しました。
これだけでめり込みがほぼなくなりました。
なぜFixedUpdateでうまくいくのか?
今回のような、”キャラと壁との衝突”の処理は物理演算によって行われるためです。
UpdateとFixedUpdateの違い
〇Updateメソッド
- 呼び出し頻度: Updateメソッドは、フレームごとに一度呼び出されます。そのため呼び出し頻度はゲームのフレームレートに依存します。
- 用途: プレイヤーの入力処理、アニメーションの更新、UIの更新など、フレームごとに実行する必要がある処理に使用されます。
〇FixedUpdateメソッド
- 呼び出し頻度: FixedUpdateメソッドは、一定の時間間隔(デフォルトは0.02秒)で呼び出されます。これは物理演算の更新と同期しています。そのため、FixedUpdateの呼び出し頻度はフレームレートには依存しません。
- 用途: 物理演算、Rigidbodyの移動、力の加算など、物理ベースの処理に使用されます。FixedUpdateは物理エンジンの更新と一致するため、物理的な動作を安定して実行することができます。
物理演算を行う際は、FixedUpdateメソッドを使用しましょう。
上記で解決しない場合
今回、私は上記の修正のみで直すことができました。
ただ、他にも解決案はたくさんあるみたいなので、下記にまとめてみました。
上記で解決しなかった場合はこちらも試してみるといいでしょう。
Rigidbodyの設定を確認する
- キャラクターにRigidbodyコンポーネントが付いていることを確認する
- Rigidbodyの設定で、InterpolateをInterpolateに設定して、物理演算のスムーズさを向上させる
- Collision DetectionをContinuousまたはContinuous Dynamicに設定して、高速移動時の衝突をより正確に検出する
補足:Continuous DynamicはDiscreateに比べると、処理の負荷は少しだけ高いので要注意です。
物理マテリアルの設定
- キャラクターと壁のコライダーに物理マテリアルを適用し、摩擦やバウンスの値を調整
補足:摩擦が高すぎると、壁にめり込みやすくなることが理由です。
キャラクターコントローラの設定
- キャラクターがCharacterControllerを使用している場合、移動速度やステップオフセットを調整して、衝突時の動作を改善
- CharacterControllerのSkin Widthを適切に設定することで、壁との衝突をよりスムーズに処理できる
コライダーの形状を確認する
- キャラクターと壁のコライダーの形状が適切か確認。キャラクターにはカプセルコライダー、壁にはボックスコライダーを使用するのが一般的
移動ロジックの見直し
- transform.Translateではなく、Rigidbody.MovePositionを使用して移動させると、物理エンジンとの整合性が保たれる
おわりに
今回はキャラクターを動かした際の壁にめり込む問題についてお伝えしました。
今後も、調べても簡単に解決しなかった問題については記事にして紹介していきたいと思います。
コメント