Unity: Rigidbodyでオブジェクトを動かす


突然Unityに目覚めました(/・・)/
楽しいですね、3Dプログラミング。今日から学んだことメモっていきます。

さて、今回は球体を平面に落下させ、カーソルキーで動かす方法を学んだのでメモします。完成イメージ↓


オブジェクトの移動方法

Unityでオブジェクトを移動する方法はざっくり3つあるようです。

  • 位置を変える
  • 向きを変える
  • アニメーションを変える

今回は、はじめの”位置を変える”方法を学びました。と言っても、この”位置を変える”方法もさらに大きく4つあるようで、

  • Rigidbody
  • Transform
  • CharactorController
  • Vector

でオブジェクトの位置を変えることが可能とのこと。今回は、これらのうちの1つ、Rigidbodyで移動する方法を書いていきます。

それでは必要な環境を揃えていきましょう。まずはオブジェクトを揃えるところから。

オブジェクト

オブジェクトは、ヒエラルキータブで右クリック3D Objectで生成できます。生成するオブジェクトは↓の2つ

  • Plane(平面): Fieldと命名
  • Sphere(球体): Ballと命名。インスペクタのTransform要素のPosition Y軸を2に変更

ここまでで、↓のようになるはずです。オブジェクトに色が付いてますが、この後に一緒にやっていくので今はお気になさらず。

なお、ヒエラルキータブはこんな感じになります。


マテリアル

続いてマテリアル。Ball、Fieldそれぞれにマテリアルを作成して色を与えましょう。

わかりやすいように、マテリアルを保存するフォルダを下の方にあるプロジェクトタブのAssets配下に作成します。

Scenesフォルダはデフォルトで存在しますが、今回は触れません。Scriptsフォルダはデフォルトでは存在しませんが、後ほど作成しますので今は気にしないでください。

さて、Materialsフォルダに移動して、先ほど生成したBallオブジェクトとFieldオブジェクトに属性を与えていきます。Materialsフォルダを開いて、右クリックでCreateMaterialを押してファイルを2つ作ります。できたファイルをそれぞれBall、FieldにRenameしましょう。

作ったBallマテリアル、Fieldマテリアルの色を変えていきます。僕はこんな感じにしました。

それと、落下後のBallオブジェクトにはね返りを与える為にPhysic MaterialをBallオブジェクトに与えます。右クリックCreatePhysic Materialを選択し、これもBallにRename。値を↓のようにしました。Bouncinessを0.99にすると自然な感じになるそう。


最終的に、Materialsフォルダ内はこんな風になります。


ここまでできたら、Materialsフォルダ内のそれぞれのファイルをドラッグし、ヒエラルキータブのそれに対応するオブジェクトにアタッチしましょう。

しかし、このまま実行してもBallオブジェクトは落下しません。落下してもらうには、重力を与えなければいけません。ここで出てくるのが、Rigidbodyです。


BallオブジェクトにRigidbodyを追加

オブジェクトにRigidbodyを追加することで、オブジェクトに物理特性を与えることができます。今回は、Ballオブジェクトに重力を与えて落下するようにします。

  1. ヒエラルキータブでBallをタップ
  2. インスペクタタブがBallのものに変わるので、そこでAdd Componentをクリック
  3. Rigidbodyを追加


追加できたら、Use Gravityにチェックを入れて重力を与えます。詳しい属性についてはこちらが参考になります。


スクリプト

Ballオブジェクトをキーで操作する為にスクリプトを用意します。マテリアルの章で、Assets配下にScriptsフォルダを作成しましたが、ここにオブジェクトに動きを与えていくソースコードを置いていきます。

Scriptsフォルダに移動して、右クリックCreateC# ScriptC#ファイルを作成。ファイル名をBallScriptとします。

ファイルをダブルクリックすると、デフォルトでVisual Studio Communityでファイルが開かれます。ファイルが開けたら、↓のように書いていきます。

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

public class BallScript : MonoBehaviour
{
    public Rigidbody rb;
    // Start is called before the first frame update
    void Start()
    {
        rb = GetComponent<Rigidbody>();
    }

    // Update is called once per frame
    void Update()
    {
        var speed = 200;

        if (Input.GetKeyDown(KeyCode.LeftArrow))
        {
            rb.AddForce(Vector3.left * speed, ForceMode.Force);
        }

        if (Input.GetKeyDown(KeyCode.RightArrow))
        {
            rb.AddForce(Vector3.right * speed, ForceMode.Force);
        }
    }

}
  • Startメソッド内で、GetCompomentメソッドを使ってBallオブジェクトのRigidbodyを取得、インスタンス化。
  • Updateメソッド内で、Rigidbodyに力を加えます。左矢印キーが押されると左方向に力を200加え、右も同様。

AddForceメソッドのパラメータ詳細やVector3の詳細など、より細かいことはまた別に記事にしたいと思います。

ここまでできたら、BallScriptファイルをヒエラルキータブのBallオブジェクトにアタッチします。

以上で、gifファイルの動きを実装できます。

ここまでご覧になられた方、ありがとうございました..! 問題点やこうした方がいい!などあればコメントいただけると大変喜びます。