xavolog

同居しているカニ様の記録だったりあれこれ

Unityでキャラクターに物理的な実装をしたかった

右往左往したことを記録しておく。

日記です。

やりたかったこと

前提

  • キャラの形状が変わることがある
  • キャラの実体*1インスタンスを入れ替えることで変形を実装している
  • キャラの実体がcolliderを持っているのでこいつを使いたい

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がめり込んで吹っ飛ぶようになってしまったので、こんどはこれをなんとかしたい。

*1:メッシュを子オブジェクトに持つ

*2:キャラが移動できない設定の形態になった時。大変都合がいい。