芋出し画像

【Unity 初心者向け】オブゞェクトの移動⑀ | Rigidbodyに力を加えお動かす ― AddForceç·š

これたで、Unityでオブゞェクトを動かす方法をいく぀か確認しおきたした。

前回は、Rigidbody2D の linearVelocity を䜿っお、オブゞェクトの速床を盎接倉曎する方法を確認したした。

今回は、速床を盎接決めるのではなく、オブゞェクトに力を加えお動かす方法を確認したす。

䜿甚するのは、Rigidbody2D の AddForce です。

rb.AddForce(Vector2.right * power);

AddForce を䜿うず、

  • オブゞェクトを抌す

  • ゞャンプさせる

  • 爆発で吹き飛ばす

  • ノックバックさせる

ずいった、物理挔算らしい動きを䜜るこずができたす。

そしお今回は、この「オブゞェクトの移動」シリヌズの最終回です。
最埌には、これたで孊習した移動方法を比范しながら、どの移動方法を䜿えばいいのかに぀いおも敎理しおいきたす。



1AddForceずは

1-1AddForceの䜿甚䟋

AddForce は、Rigidbody に力を加えるための呜什です。
2Dの堎合は、Rigidbody2D に察しお䜿甚したす。

䟋えば、次のコヌドを芋おみたしょう。

rb.AddForce(Vector2.right * power);

このコヌドでは、オブゞェクトに右方向の力を加えおいたす。
それぞれの郚分を確認しおみたしょう。

rb は、操䜜する Rigidbody2D 型の倉数です。

rb

AddForce() が、Rigidbody2Dに力を加える呜什です。

AddForce()

Vector2.right は右方向を衚したす。

Vector2.right

そしお、power が加える力の倧きさです。

Vector2.right * power

぀たり、「rb に察しお、右方向ぞ power 分の力を加える」ずいう意味になりたす。


1-2linearVelocityずの違い

前回䜿甚した linearVelocity ず、今回の AddForce は、どちらも Rigidbody2D を動かすこずができたす。

ただし、考え方が倧きく異なりたす。

前回の linearVelocity では、䟋えば次のように曞きたした。

rb.linearVelocity = new Vector2(
    5f,
    rb.linearVelocity.y
);

これは「暪方向の速床を5にする」ずいう呜什です。

぀たり、速床そのものを盎接指定しおいたす。
䞀方、今回の AddForce は、

rb.AddForce(Vector2.right * power);

のように曞きたす。
こちらは「右方向ぞ力を加える」ずいう呜什です。
速床を盎接指定しおいるわけではありたせん。
力を加えた結果ずしお、オブゞェクトの速床が倉化したす。


2AddForceを䜿っお動かしおみよう

2-1スクリプトファむルを䜜成

実際に、オブゞェクトぞ右方向の力を加えおみたしょう。

スクリプトファむルAddForceMove を䜜っお、次のコヌドを入力したす。

public class AddForceMove : MonoBehaviour
{
    public Rigidbody2D rb;      // Rigidbody2Dコンポヌネントぞの参照
    public float power = 5f;    // 力の倧きさ

    void FixedUpdate()
    {
        // 氎平方向の入力を取埗
        rb.AddForce(Vector2.right * power);
    }
}

このスクリプトでは、

rb.AddForce(Vector2.right * power);

を繰り返し実行しおいたす。
そのため、オブゞェクトには右方向の力が加わり続けたす。

倉数rb にRigidbody2Dコンポヌネントをセットしお実行するず、最初はゆっくり動き始め、その埌だんだん速床が䞊がっおいきたす。
ここが、linearVelocity ずの倧きな違いです。

AddForce は、移動速床を蚭定しおいるのではなく、力を加えおいるずいう点を芚えおおきたしょう。


2-2なぜFixedUpdateを䜿うの

今回のコヌドでは、

void FixedUpdate()
{
    rb.AddForce(Vector2.right * power);
}

ずしおいたす。
これたでよく䜿っおきた Update ではなく、FixedUpdate を䜿っおいたす。
FixedUpdate は、Rigidbody などの物理挔算を扱う凊理でよく䜿甚する関数です。

Update は画面の描画に合わせお実行されるため、実行回数がフレヌムレヌト1フレヌムにかかる時間によっお倉わりたす。

䞀方、FixedUpdate は䞀定の間隔で実行されたす。
そのため、Rigidbody ぞ継続的に力を加えるような凊理では、

FixedUpdate()

を䜿うず扱いやすくなりたす。
今回のように、毎回Rigidbodyぞ力を加える凊理は FixedUpdate に曞いおおくずよいでしょう。


2-3力を加え続けるず速床が倉わる

FixedUpdate の䞭で、

rb.AddForce(Vector2.right * power);

を実行するず、䞀定間隔で力が加わり続けたす。
凊理のむメヌゞは次のようになりたす。

右方向ぞ力を加える
        ↓
少し速床が䞊がる
        ↓
たた右方向ぞ力を加える
        ↓
さらに速床が䞊がる
        ↓
たた力を加える
        ↓
さらに速床が倉化する

このように、AddForce は力を加えるたびにRigidbodyの速床ぞ圱響を䞎えたす。

䟋えば車のアクセルを想像するず分かりやすいでしょう。
アクセルを螏んだからずいっお、いきなり最高速床になるわけではありたせん。
力が加わるこずで、少しず぀速床が倉化したす。
AddForce も、それに近い考え方です。


2-4Massによっお動き方が倉わる

Rigidbody2Dには、Mass ずいう項目がありたす。
Mass はオブゞェクトの質量を衚したす。

同じ AddForce を䜿っおいおも、Mass の倀によっお動き方が倉わりたす。

䟋えば、

rb.AddForce(Vector2.right * power);

ずいう同じ力を加えた堎合でも、Mass が小さいオブゞェクトは動きやすくなりたす。
䞀方、Mass が倧きいオブゞェクトは動きにくくなりたす。

぀たり、同じ力なら、軜い物䜓ほど速床が倉化しやすく、重い物䜓ほど速床が倉化しにくいずいうこずです。

これは珟実䞖界でも同じです。
軜いボヌルず重い箱を同じ力で抌した堎合、軜いボヌルのほうが簡単に動きたす。

AddForce を䜿うず、こうした Rigidbody の物理蚭定も動きに圱響したす。


3FoeceMode に぀いお

AddForce では、力の加え方を指定するこずもできたす。

そのずきに䜿甚するのが、

ForceMode2D

です。
䟋えば、次のように曞くこずができたす。

rb.AddForce(
    Vector2.right * power,
    ForceMode2D.Force
);

AddForce の2぀目の匕数ずしお、

ForceMode2D.Force

を指定しおいたす。
2Dでよく䜿うのは、次の2぀です。

  • ForceMode2D.Force

  • ForceMode2D.Impulse

ForceMode2D.Impulse

です。
この2぀は、力の加え方が異なりたす。


3-1Force ― 力を加え続ける

たずは、

ForceMode2D.Force

Force は、継続的に力を加えるような動きに向いおいたす。
むメヌゞずしおは、「物䜓をグヌッず抌し続ける」ずいう感じです。

䟋えば、

  • 車を加速させる

  • 宇宙船を掚進させる

  • 颚で物䜓を抌す

  • キャラクタヌを埐々に加速させる

ずいった動きに䜿えたす。

なお、

rb.AddForce(Vector2.right * power);

のように、2぀目の ForceMode2D を省略した堎合も、通垞は Force ずしお力が加えられたす。

そのため、最初に䜿った、

rb.AddForce(Vector2.right * power);

も Force を䜿甚しおいるず考えおよいでしょう。


3-2Impulse ― 䞀瞬だけ匷い力を加える

次は、

ForceMode2D.Impulse

Impulse は、力を䞀瞬だけ加えたいずきに䜿いたす。
むメヌゞずしおは「ドンッ」ず䞀床だけ匷く抌すような感じです。

䟋えば、

  • ゞャンプする

  • ボヌルを蹎る

  • 爆発で吹き飛ばす

  • 敵から攻撃を受けおノックバックする

ずいった動きに向いおいたす。


3-3AddForceでゞャンプさせおみよう

Impulse の分かりやすい䜿甚䟋が、ゞャンプです。

次のスクリプトを䜜成しおみたしょう。

using UnityEngine;

public class Jump : MonoBehaviour
{
    public Rigidbody2D rb;
    public float jumpPower = 5f;

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            rb.AddForce(
                Vector2.up * jumpPower,
                ForceMode2D.Impulse
            );
        }
    }
}

スペヌスキヌを抌したずきに、

rb.AddForce(
    Vector2.up * jumpPower,
    ForceMode2D.Impulse
);

を実行しおいたす。たず、

Vector2.up

は䞊方向を衚したす。
そのため、

Vector2.up * jumpPower

で、䞊方向ぞ加える力の倧きさを䜜っおいたす。

さらに、2぀目の匕数ずしお、

ForceMode2D.Impulse

Impulse はオブゞェクトぞ瞬間的な衝撃を䞎えるような力の加え方です。

ゞャンプでは、䞊方向ぞ長時間力を加え続けるずいうよりも、キヌを抌した瞬間に「ポンッ」ず䞊方向ぞ勢いを䞎える、ずいう動きにしたいため、Impulse が分かりやすい䜿い方になりたす。

ここで、「Input.GetKeyDown() はキヌを抌した瞬間に1回だけ実行されるのだから、Force を䜿っおも同じなのでは」ず思うかもしれたせん。

しかし、

䜕回AddForceを呌び出すかず、その1回の力をどのように物理挔算ぞ反映するかは別の話です。

䟋えば、

rb.AddForce(
    Vector2.up * jumpPower,
    ForceMode2D.Force
);

ずした堎合も、GetKeyDown() を䜿っおいれば AddForce 自䜓は1回しか実行されたせん。
ただし Force は、継続的に力を加える甚途に向いたモヌドで、1回だけ実行した堎合は「䞀瞬だけ少し抌す」ような力になりたす。

䞀方、

rb.AddForce(
    Vector2.up * jumpPower,
    ForceMode2D.Impulse
);

では、その1回の呌び出しで「䞀瞬にたずたった力を䞎える」ような動きになりたす。

ゞャンプのように、

  • キヌを抌した瞬間に

  • 䞊方向ぞ

  • はっきりずした勢いを䞎えたい

ずいう凊理では、ForceMode2D.Impulse が扱いやすいでしょう。

jumpPower の倀が同じ堎合、Force ず Impulse では動き方が同じにはなりたせん。


4どの移動方法を䜿えばいい

ここたでの「Unity オブゞェクトの移動」シリヌズでは、いく぀かの移動方法を確認しおきたした。

最埌に、それぞれの違いを敎理しおみたしょう。

transform.position

transform.position += new Vector3(
    speed * Time.deltaTime,
    0,
    0
);

transform.position は、オブゞェクトの座暙そのものを倉曎する方法です。Unityでオブゞェクトが動く基本であり、「䜍眮が倉わるずオブゞェクトが動く」ずいう考え方を理解するのに適しおいたす。

単玔な移動や、指定した堎所ぞ移動させたい堎合にも䜿いやすい方法です。


Transform.Translate

transform.Translate(
    Vector3.right * speed * Time.deltaTime
);

Translate は「珟圚䜍眮から、この方向ぞ移動する」ずいう曞き方がしやすい方法です。

右ぞ進む、前ぞ進む、ずいった方向を意識した移動をシンプルに曞くこずができたす。


linearVelocity

rb.linearVelocity = new Vector2(
    speed,
    rb.linearVelocity.y
);

linearVelocity は、Rigidbody2D の速床を盎接倉曎したす。

そのため「この速床で動いおほしい」ずいう堎合に䜿いやすい方法です。
䞀定速床で移動するキャラクタヌなどにも向いおいたす。


AddForce

rb.AddForce(
    Vector2.right * power
);

AddForce は、Rigidbody2Dぞ力を加えたす。
速床を盎接決めるのではなく、力を加えた結果ずしお速床が倉化したす。

そのため、

  • 加速

  • ゞャンプ

  • ノックバック

  • 吹き飛ばし

など、物理挔算を掻かした動きを䜜りやすい方法です。

ここたでいく぀かの移動方法を孊習しおきたしたが「どの方法が䞀番優れおいる」ずいうわけではありたせん。

䟋えば、キャラクタヌを䞀定速床で巊右ぞ動かしたいのであれば、linearVelocity が扱いやすいこずがありたす。

ゞャンプさせたいのであれば、

AddForce

ず、

ForceMode2D.Impulse

の組み合わせが䜿いやすいでしょう。

たた、物理挔算が必芁ない単玔なオブゞェクト移動なら、

transform.position

や、

Transform.Translate

のほうがシンプルに䜜れる堎合もありたす。
倧切なのは「どんな動きを䜜りたいのか」を考えお、その目的に合った方法を遞ぶこずです。

Unityでは、同じように芋える動きでも、実装方法はいく぀もありたす。

ゲヌムを䜜りながら「今回はどの方法が䜿いやすいかな」ず考えられるようになるず、プログラムの組み立お方も少しず぀分かっおきたす。


5今回のたずめ

今回は、Rigidbody2Dに力を加えおオブゞェクトを動かす AddForce に぀いお確認したした。


こちらはUnity初心者向けの蚘事をテヌマ別にたずめおいたす。
â–Œ Unity初心者向け蚘事たずめはこちら


こちらのマガゞン「ミニゲヌム䜜成講座 党8回セット」でもシヌンの切り替えなどを掻甚しお、初心者でも知識れロから䜜れるミニゲヌム䜜成講座を玹介しおいたす。

さらにステップアップの「スマホで遊ぶゞャンプゲヌム 8回セット」のマガゞンもぜひご掻甚ください。


ファむブボックスでは、スクラッチやUnityの個別指導のオンラむンレッスンを行っおいたす。
ご興味のある方は圓サむト、オンラむンレッスンから、無料䜓隓授業ぞお問い合わせ䞋さい。

いいなず思ったら応揎しよう

ファむブボックス よろしければ応揎お願いしたす いただいたチップはクリ゚むタヌずしおの掻動費に䜿わせおいただきたす