【unity入門】AddForceを使ったRigidbodyの移動

アクションゲームを作成するには移動が不可欠ですよね。

unityでオブジェクトを移動させる簡単な方法は、Rigidbodyコンポーネントをオブジェクトに追加し、AddForce関数を使って動かすという方法です。

この記事ではAddForce関数を使ってオブジェクトを動かす方法について解説します。

今回作るもの

パソコンの方向キーで玉を操作して、地面の上を動かしていこうと思います。

やること

具体的にやることは、

1.Rigidbodyコンポーネントをオブジェクトに追加
2.AddForce関数を使ったコードの記述

それでは早速始めていきましょう!

Rigidbodyコンポーネントをオブジェクトに追加

Rigidbodyコンポーネントをオブジェクトに追加していきましょう。

まずはボールと地面二つのオブジェクトを作成します。

地面の作成

HierarchyビューからCreate>3D Object>Cubeでオブジェクトを作ります。

今回は地面を作りたいので、オブジェクトを平らにします。

オブジェクトを選択した状態で、Scaleのxとzを10にしてください。

これで地面が完成しました。

玉の作成

次は玉を作成していきます。

HierarchyビューからCreate>3D Object>Sphereを選択して作成します。

これで玉ができました。

Rigidbodyを追加

今回はAddForce関数を使ってボールに追加されたRigidbodyコンポーネントに力を加えることで移動させます。

しかし、オブジェクトは作成した状態だとRigidbodyコンポーネントが追加されていません。

ですので、次はRigidbodyコンポーネントを玉オブジェクトに追加していきます。

追加の仕方は、sphereオブジェクトを選択した状態で

InspectorからAddComponent>Physics>Rigidbodyを選択することで追加されます。

Sphereオブジェクトを確認してみると、Rigidbodyが追加されていますね。

AddForce関数を使ったコードの記述

スクリプトの作成

玉を動かすコードを記述するためのスクリプトを作成します。

HierarchyビューからCreate>C#Scriptを選択することで作成できます。

スクリプトの追加

スクリプトを作成したらオブジェクトにコンポーネントとして追加しましょう。

今回は玉を動かしたいので玉にスクリプトを追加します。

追加の仕方は、スクリプトをSphereオブジェクトにドラッグ&ドロップです。

これでスクリプトがコンポーネントとして追加されました。

方向キーの入力を受け取る

今回は方向キーが押された方向に力を加えて玉を動かします。

ですので、まずは方向キーがどの方向に押されたのか判断するためのコードを記述します。

コード内容は、

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class NewBehaviourScript : MonoBehaviour {

    //一秒間に一定の回数呼ばれる
    void FixedUpdate()
    {
        // 入力をxとzに代入
        float x = Input.GetAxis("Horizontal");
        float z = Input.GetAxis("Vertical");
    }
}

簡単に解説すると、FixedUpdate関数は{ }の中に書いた記述が一秒間に一定の回数呼ばれます。

FixedUpdate関数の中に記述された

// 入力をxとzに代入
        float x = Input.GetAxis("Horizontal");
        float z = Input.GetAxis("Vertical");

Input.GetAxis("Horizontal")

水平方向、つまり矢印キーの左右の入力を-1から1までの小数で返します。

左のキーを押している間は-1に段々と近づいていき、ずっと押していると-1に至ります。

反対に右のキーを押している間は1に段々と近づいていき、ずっと押していると1に至ります。

そしてその-1から1までの値を変数『x』に格納します。

float z = Input.GetAxis("Vertical");

もほとんど同じで垂直方向、つまり矢印キーの上下に対応してます。

Rigidbodyを取得

今回は玉オブジェクトに追加されたRigidbodyコンポーネントに力を加えることで移動させるのでした。

ですので、コードの中でRigidbodyに力を加えられるように玉オブジェクトに追加されたRigidbodyコンポーネントを取得しましょう。

Rigidbodyコンポーネントを取得するコードは、

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class NewBehaviourScript : MonoBehaviour {

    //一秒間に一定の回数呼ばれる
    void FixedUpdate()
    {
        // 入力をxとzに代入
        float x = Input.GetAxis("Horizontal");
        float z = Input.GetAxis("Vertical");

        //Rigidbodyを取得
        Rigidbody rb = GetComponent<Rigidbody>();
    }
}

今回追加されたのは、

//Rigidbodyを取得
Rigidbody rb = GetComponent<Rigidbody>();

ですね。

簡単に説明をすると、GetComponent()という関数はスクリプトが付いているオブジェクトのcomponentを取得します。

GetComponentの後ろにある『<>』はcomponentの種類を表しています。

ですので、GetComponent<Rigidbody>()はRigidbodyの取得という意味です。

今回は、

Rigidbody rb = GetComponent<Rigidbody>();

ですので、Rigidbodyを取得してRigidbody型の変数『rb』に格納しています。

変数『rb』は適当に決めたものですので、わかりやすければなんでも構いません。

AddForceで力を加える

それではAddForce関数を使ってRigidbodyに力を加える記述をしていきます。

記述内容は、

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class NewBehaviourScript : MonoBehaviour {

    //一秒間に一定の回数呼ばれる
    void FixedUpdate()
    {
        // 入力をxとzに代入
        float x = Input.GetAxis("Horizontal");
        float z = Input.GetAxis("Vertical");

        //Rigidbodyを取得
        Rigidbody rb = GetComponent<Rigidbody>();

        //Rigidbodyに力を加える
        rb.AddForce(x, 0, z);
    }
}

今回追加された部分は

//Rigidbodyに力を加える
rb.AddForce(x, 0, z);

簡単に解説すると、玉オブジェクトのRigidbodyコンポーネントが格納された変数『rb』にAddForce関数で力を加えています。

AddForce関数は引数で力を加える方向が決まります。

変数.AddForce(x軸,y軸,z軸)

今回はx軸とz軸に矢印キーの値を入れたので、矢印キーを押した方向に力が加わります。

ですので、矢印キーを押した方向に動くのです。

実行結果は、

無事に動いていますね!

まとめ

この記事ではAddForceを使ったRigidbodyの移動についてやりました。

unityで3dゲームを作る場合、移動はよく使いますので、ぜひ覚えておいてください!