Unityでキャラクターに物理的な実装をしたかった
右往左往したことを記録しておく。
日記です。
やりたかったこと
前提
CharacterControllerは動かすのが楽になるが、colliderがカプセルに限定され、子オブジェクトがコライダーを持っていても使われない。
さらに斜面に乗っていると下向きに力が加わるなどの物理的な処理が行われない
要件
- キャラ形状のインスタンスを入れ替えたらそれについてるcolliderが使われる
- 物理演算をさせたい
右往左往
1. Rigidbodyを追加
Rigidbodyは子オブジェクトのColliderを拾ってくることができるのでつけてみた。Use Gravityをオンにして、コントローラーの入力に対してベクトル生成 -> Rigidbody.velocityに代入。
参考:【Unity】Rigidbodyを用いたキャラ操作の実装 - Qiita
2.CharacterControllerを除去
移動をRigidbodyの速度入力にしたのでいらないだろうと思い除去。
Colliderがキャラ形状に合うようになった!やったー!
3.登れない…
実はここまで平面しか移動させたことがなかった。階段と坂道を作ったところ、登れないことが判明した。
ここでCharacterControllerが階段と坂道を登る機能を持っていることを思い出す。
4.CharacterControllerを戻して妥協策へ
Rigidbodyを使って階段の上り下りは不可能なことではない
参考:キャラ操作をCharacterControllerからRigidbody+コライダに変更する | Unityを使った3Dゲームの作り方(かめくめ)
が、今回はプロトタイプなのと、物理処理が必要な場合がかなり限定的*2だったため、必要な時だけRigidbodyを追加して切り替えることにした。
キャラの変形のコールバックとしてRigidbodyをとったりつけたりするアクションを追加して、要件の2点を満たすことができた。
締め
悩んで先に進まなくなりがちなので4番目の妥協を即座にできたのは良かった。
要件についてはこれで満たせたのでいいのだが、キャラが変形した瞬間にColliderがめり込んで吹っ飛ぶようになってしまったので、こんどはこれをなんとかしたい。