今回は衝突判定について調査していきます!検証会ってことで2.1!
2022年1月に更新しました
Unitychanの歩かせ方いろいろ検証
作成条件
1,人として自然
2,壁を通り抜けない
3,階段を登れる
これらの条件満たすことのできる歩かせ方を検証していきます
検証してくれるUnityちゃんのそれぞれの特性をまとめました
移動方法\コンポーネント | ①RigidBody+Collider | ②CharactorController |
③RigidBody移動 | 使用不可 | |
④transform移動 | ||
⑤Move関数移動 | 使用不可 |
各項目説明
コンポーネント:キャラクターが持つコンポーネント
①RigidBody+Colliderのキャラクター
②CharctorControllerのキャラクター
移動方法:スクリプトで制御する移動方法
ソース内容については次回記事で取り扱います、
→Unityちゃんを実際に歩かせてみる 後編 #3 - うにty生活
とりあえずどういう移動方法が良いかだけ考えていきます
③どの方向にもそちらを向いて歩くスクリプト(RigidBody移動)
④ 歩き方は人間ぽいが後ろだけムーンウォークするスクリプト(transform移動)
⑤ 2をベースにMove関数で動かすスクリプト(Move関数)
比較
長いので項目1は「C」、項目2は「S」でそのあとに番号をつけて省略します
例:C1/S2
→RigidBody+Colliderコンポーネントのtransform移動方式といった感じ
・① と③
RigidBodyに力を加えて動かす方法
重力も働いていて衝突判定もある(Collider)が階段が登れない
Rayを飛ばして傾斜を計算して登る方法もありますが、処理が重たいし、数学が弱いため却下
・① と ④ (候補1)
C1/S1と比べて階段が登れる
違いはtransform移動するためだと考えられる。
・① と ⑤
charctorcontrollerでないため使えない
・② と ③
RigidBodyがないため使えない
・② と ④
OnTriggerEnterで衝突判定可能
処理を別に記述しなければ壁を通り抜けてしまう、階段も登れない
そして他のオブジェクト全てisTriggerをonにしなければいけないため面倒
・② と ⑤ (候補2)
Move関数で動かすとOnControllerColliderHitの方で検出可能、そして何もしなくとも壁をすり抜けない
重力を無理やりつけているため少し動作が重たく、横回転するのが遅い
「①/④」と「②/⑤」はこれでほぼ同等の動きができるようになりました。
実際の動作を比較
わかりやすいように3人のUnityChanにテストランウェイを通ってもらいました笑
横から見るとこんな感じ。
階段で壁抜けと階段登り二つを同時に検証します。
余談ですがProBilderが使えるようになるまで自分はこのような階段はCubeを重ねて自分で作っていました・・・
ProBilder素晴らしい!
何はともあれミスUnityChanグランプリの開催です!
左(候補2):CharctorController+Move関数(OnControllerColliderHit関数で衝突検知)
中央(候補1):RigidBody+Collider +transform移動
右:CharctorController + transform移動(OnTriggerEnterで衝突検知)
右は比較のために追加しました
ミスUnityChanグランプリ結果発表
左(候補2)と中央(候補1)のUnityちゃんには審査員さんも困った顔をしています
二人とも条件の、「壁抜けしないこと」、「階段が登れる」はクリアです
最後の「自然に見えるか」という条件ですが左は階段を上るスピードと床を歩くスピードが一緒、普通階段では遅くなりますので中央のUnityちゃんが自然に見えます。
そして無理な重力がかかっていないため向き変えも軽いです。
また、RigidBodyの処理の方が軽いということで
この家で生活してもらうUnityちゃんはRigidBody+Collider+transform移動のUnityちゃんに決定です!(パチパチ)
ただ左のUnityちゃんもHit関数に処理を追加すれば、階段の時だけスピードを下げることや
なんのオブジェクトとも衝突してない時だけ重力をかけるなど工夫をすれば使えるため
左のUnityちゃんは補欠として中央Unityちゃんに出来ない場面があった時に活躍してもらおうと思います(^^)
まだまだこれからだ、うにty生活