🏃‍♂️

【Unity】AddForceとvelocityを使ったキャラの移動方法

2021/04/25に公開
1

移動方法は色々ありますが、基本的にこれら二つを使用しているので紹介します。

velocityでの移動方法

こちらがvelocityで再現した動きです。速度変化なのできびきびした動きです。

https://www.youtube.com/watch?v=zVn0HVt--n0

速度を変更してオブジェクトを移動させる方法です。3D上で上下左右に移動します。

問題点は重力が弱くなる、他にも反対方向に移動する場合速度が急に変化するため自然ではない、速度を指定したままなのでaddfoceが使っても指定した速度のまま(つまりvelocityを使った移動している最中にaddforceしてもその次のフレームで速度が直接上書きされる)という事があります。

問題点の解決方法

・重力を強くする

・Addforceしたい場合はvelocityを一旦無効にする

AddForce(ForceMode.Force)での移動方法

動画半分目ぐらいからになります。ちょっと動画だとわかり辛いかもしれませんが動き始めのスピードや方向転換の際、velocityは急激に変化していますがaddforceでは徐々に変化しています。

https://www.youtube.com/watch?v=lFYj0ayfWMM

velocityでのスクリプトの一部分を以下のように変更します。

rb.velocity = new Vector3(movingVelocity.x, rb.velocity.y, movingVelocity.z);
                ↓
rb.AddForce(movingVelocity, ForceMode.Force);

さらにこれだとドリフト現象が起こってしまうのでRigidbodyコンポーネントからDragを適当に増やします。Dragは要するにブレーキです。

ただしこれだと重力にもブレーキがかかってしまうというデメリットがあります。

Dragを使わないAddforce

重力に問題があったのでPhisicsMaterialの摩擦力を挙げて,dragを0.1程度にしてみました。

スクリプトはこんな感じにしましたが、速度が一定にならない。

                if (rb.velocity.magnitude > 5)
                {
                    rb.AddForce(moving * runSpeedMag, ForceMode.Force);
                }

そこで以下に変更したら速度はほぼ一定になりました。速度が上がるにつれて力も弱くなります。

         float runSpeedMag = 2;
         if (rb.velocity.magnitude > 5)
                {
                    float speedMag = runSpeedMag - rb.velocity.magnitude;
                    rb.AddForce(moving * speedMag, ForceMode.Force);
                }

RigidBodyの細かい設定の紹介

RigidBodyは基本的にFixedUpdate内で使用する(それかTime.deltaTime使う)

またどちらも回数が固定のFixedUpdateで使用します。Updateだと端末によって呼ばれる回数が異なります。Projectsetting→Time→Fixed timestepでfixedupdateの呼ばれる回数を調整できますがデフォルトでは0.02なので1フレームに50回呼ばれます。だいたいのゲームが60fpsなのでそんなものでしょう。Fixed timestepは1フレームあたりの秒数です。

RigidBody.Interpolateでスムーズに

コンポーネントから設定でき、移動が補完されよりスムーズになりますが重くなってしまうので操作キャラクターのみに適用しましょう。

重力をスクリプトからかけよう

紹介した方法だとデフォルトの状態だと重力が弱くなるのでスクリプトから重力をかけます。ジャンプなどを実装する場合は必須です。

    //fixedupdateで使用
    void Gravity()
    {
        rb.AddForce(new Vector3(0, -30000, 0));
    }

結局何がいいのか?

Dragを強めにしてAddForceで移動が今の所一番マシのような気がしてます。内容は関係ないですがその方法で実装した移動です。
https://www.youtube.com/watch?v=-MPJnTw3tIo
一番自然でシンプルで物理挙動ができる移動方法は模索中です。おすすめの方法があれば教えてください。

追記 : 最終的に【Unity】RigidBodyで移動とジャンプを実装する方法の方法で上手くできました

だめだった方法

addforceで行って、一定の速度に近づくにつれて加速力を弱めて一定速度を保てる。しかし、ドリフトが発生してしまいボタンを入力または離した時にvelocityをvector3.zeroにするも一瞬止まって不自然でだめだった。

記事は以上です。お疲れ様でした😌

Discussion

えんどうえんどう

始めましてm(_ _)m
Unityで初代PS風のな3Dゲームを作ってます。

アクションRPGを作ろうとしているのですが、
初心者で、、、

この記事のおかげで、キャラクターを思うように動かせるようになりました!
たすかりました~!
感謝いたします。