導入
プレイヤーを動かす設定はできたが、今度はプレイヤーが壁にくっつくようになってしまった。…そんな人の為に、解決策とその現象が発生する原因を解説します。
以下に紹介するのは2Dでの対処方法ですが、3Dでも応用できるように原因を解説しているので、3Dで困っている方は「原因の解説」を読むことをお勧めします。
▼問題の現場はこんな感じ
解決策
①引っかかりを直したいゲームオブジェクトにRigidBody2DもしくはBoxCollider2Dをアタッチする。
②Project > Asset を開き、左上の「+」を押して「PhysicMaterial2D」を選択する。もしくは、右クリックして、「Create > PhysicMaterial2D」を選択する。今作成したファイルを開き、Frinction、Bouncinessを共に0にする。
③RigidBodyもしくはBoxColliderのMaterialという項目に、「Friction(摩擦)、Bounciness(反発)を両方0にしたもの」をドラッグ&ドロップで設定する。
結果
普通の横スクロールアクションのように、壁に引っかからずにプレイヤーを操作することができています。
原因の解説
原因は、「摩擦(Friction)」です。ある物体が平面に接しているとき、ある物体をその平面上で動かそうとする向きと逆向きに、その物体に対して摩擦力が働きます。そのとき働く力の大きさは、「平面が物体から垂直方向に受ける力の大きさ」×「物体と平面間の摩擦係数」で表されます。
つまり、原因は摩擦力となるわけですが、…Unityでは摩擦力の計算が少し違うことに注意して下さい。Unityでは、2Dならば、「摩擦力の大きさ=PhysicMaterialのFrinctionの大きさ」です。より正確にいえば、「Frinctionが0なら摩擦力は0、Frictionが1なら力を加えない限りオブジェクトは動かないような摩擦力がはたらく(中間値はその間)」という感じに定義されています。
そして、デフォルトの設定(None)では、「Friction=0.4、Bounciness=0」である為に、今回の現象が起きるのです。
補足
Unityの摩擦力は、先ほども述べた通り、「摩擦力の大きさ=PhysicMaterialのFrinctionの大きさ」なので、「平面が物体から垂直方向に受ける力の大きさ」には比例しません。従って、物体が重力の向きに垂直に広がる平面上を滑っていたとしても、質量(Mass)に関係なく、Frinctionの値が同じである限り、同じ摩擦力がはたらきます。
2Dでは動摩擦力(Dynamic Friction;物体が動いているときにかかる摩擦力)と静止摩擦力(Static Friction;物体が静止しているときにかかる摩擦力)は同じFrictionで定義されますが、3Dでは個別に設定することができます。