Unityでキャラクターを動かしてみた その3
こんにちは🍎
まず初めに、MeshUvControl.csに特定のタイミングで謎のMeshFilterが取得できないエラーが発生してたので、エディタ拡張の形で数値設定できるように修正しておきました。
結局OnInspectorGUIの使い方が微妙に間違ってただけですが、再生時とか終了時とかに余計な処理が走らなくなったので非効率的な初期化チェックがなくなってより良くなったと思います。(今後は気を付けたいですね🐡)
以下本題。
前回前々回でそれなりに動いてたのでもう次のテーマに行ってもいいんじゃないの?的な感じもありますが、一応まだやることあるのでその3やります。
Unity上でキャラをRigidbodyを使用してコライダーの地形判定を行って移動している際に結構悪さしてくるのがコライダーの摩擦設定だったりします。
例として素の状態でZの+方向に移動しつつジャンプした挙動です。
次に摩擦設定をセットして上記と同じ事をした時の挙動です。
自分もよくわかってなかったころは、なんか壁にこすりながらジャンプしてるとオブジェクトが引っかかって気持ちよくなかったりしてなかなか市販のゲーム見たいにならなくって何なんだろ?って思ってもやもやしてましたがコライダーに設定する「Physic Material」の設定を知ってから解決することができました。
Physic Materialって何?って方はこちら。
Unity ユーザーマニュアル 物理特性マテリアル
平たく言うと摩擦や跳ね返りを設定するもので、設定したPhysic MaterialはコライダーのMaterialにセットします。
こんな感じの。
設定を適応させたいコライダーの赤丸の部分にセットすると動作に反映されます。
※今回はわかりやすくプレイヤーキャラにセットしてます。
自分は0.1にしていますが、周りを見渡すと摩擦を0にしている人が結構いますので摩擦の数値はそこの所はお好みで設定するといいです。
とりあえずこれで解決してよかった…!と思ってるとまた新しい不具合が出てきます。(こういうのが精神的につらい…🐄)
具体的には設定した範囲の物体の摩擦が0になるので、物理的な加速、衝突や角度のついた所での落下などで一度ついた加速値が消える事がなくなります。(0.1でも消えきるまでに少しかかる)
摩擦0.1で大体こんな感じ。(0なら止まることなくすぅーっと行きます)
摩擦が無さすぎて坂を上る事も出来なくなり、さらに一度ついた加速値がなかなか消えないので困りますよね。
幸いRigidbodyには現在の速度ベクトルを設定する項目のvelocityというのがありますので、無駄な加速が起きないように設定してしまいましょう。
_rigidbody.velocity = Vector3.Scale(_rigidbody.velocity, Vector3.up);
自分で作っている現状の移動の処理では、移動中にはY方向の加速値以外は必要ないのでY以外は常に物理挙動で加速しないようにしています。
実際に上記の処理を走らせて無駄な加速が起きなくした場合の動作です。
(※自作の移動処理では実際移動の入力が切れたタイミングで上記の処理のあるループが走らなくなるので入力が切れたタイミングで坂を滑ってたりします、ここら辺の加速値の引っ張り感が少し欲しい場合は0にしないで徐々に減るようにvelocityを設定してあげれば引っ張りも残りつつきちんと移動する感じになります)
これで一通りの理想的な動きのするキャラクターの挙動ができたので、次回はこれを使用して別のことをやってみたいと思います。
実際動作するアセットフォルダも置いておきますので、アセットフォルダを空プロジェクトに入れれば確認できます。
2022_03_03_Assets.zip (446.84kB)
ダウンロード