キャラクターの移動

3Dではキャラクターを動かす処理を作ることが多いです。UnityでもCharacter Controllerというものが用意されています。これをゲームオブジェクトにつけてスクリプトでMoveを処理してやれば、移動ができます。

Character Controllerは簡単に移動処理が作れるのですが、物理挙動がなされないという特徴があります。コライダーとの衝突を検知してめり込まないとかは行われるのですが、他のコライダーにぶつかってもそれに衝撃をあたえるということはデフォルトでは起こりません。OnControllerColliderHitを使うと、他のコライダーにぶつかったときにどうするかが制御できますが、どのような力を相手に与えれば適切なのかというのは物理の知識が必要です。
リアリティを追及するには多少の知識が要りますが、入り口が緩いのがCharacter Controllerだと思います。

Rigidbodyを制御して移動を行う方法があります。Rigidbodyを使えば物理に沿った動きを自動的に実現してくれます。移動の制御をおこなうには、力を加えるか速度を指定するかで可能です。
力を加える場合は自然な動きになります。AddForceを使って移動方向に押してやることになります。慣性があるので動き出しと停止時にすぐに反応することはなくなります。ゲーム的にレスポンスが良くなくなるので、使いにくいことも多いでしょう。また、力の働き方によっては移動ではなく回転の方に使われてしまい、毎回挙動が変わるということも起こります。とくに問題になるのが、短い時間に力が何度も入力されることです。この場合、一気に加速されることになります。
速度を指定する方法は自然に反しますが、ゲーム的には使いやすいです。 ある速度に強制することで瞬時の反応が可能であり、入力が連続で起こっても問題が起きにくいです。

これはRigidbodyを使ったキャラクターの移動になります。カプセル型のオブジェクトがキャラクターです。ジャンプの処理は、地面に乗っているかを判定し上向きに速度を設定するだけで可能です。地面に乗っているかの判定は意外と難しい問題がありますが、レイキャストをキャラクターから下向きに発射しぶつかったものが何かで地面に立っているかを調べています。

このツイートで重要なのは、TPS的な操作を実現していて物理的な動作も可能になっているということです。カメラはキャラクターの周り(キャラクターを原点とする極座標として計算)に位置するようにしています。