スクリプトからのRigidbodyの操作【Unity】

GameObjectに物理エンジンを適用させるにはRigidbodyをアタッチする必要があります。RigidbodyによってそのGameObjectの物理エンジンにおける挙動を指定することができるので、ここではスクリプトからRigidbodyを操作する方法を説明していきます。

開発環境

  • Unity 2019.4.1f1

Rigidbodyとは?

RigidbodyはGameObjectに物理エンジンを適用させるためのものです。RigidbodyをアタッチすることによりGameObjectに重力の影響を受けさせて落下させたり、衝突させたり、あるいは力を加えて移動させたりといったことができるようになります。

GameObjectへのRigidbodyのアタッチ

GameObjectのインスタンス(gameObject)にRigidbodyをアタッチするには、AddComponentメソッドを用いて次のようにします。

Rigidbody rigidbody = gameObject.AddComponent<Rigidbody>();

すでにアタッチされたRigidbodyの取得

すでにGameObjectにRigidbodyがアタッチされている場合は、GetComponentメソッドを用いてRigidbodyを取得できます。例えば、GameObjectのインスタンス(gameObject)にすでにRigidbodyがアタッチされている場合は、次のようにします。

Rigidbody rigidbody = gameObject.GetComponent<Rigidbody>();

実際にRigidbodyをアタッチしてみる

白いCubeをあらかじめ用意して、赤いCubeをスクリプトから生成してみます。この時、赤いCubeにRigidbodyをアタッチしないと、

このようにお互い止まったままですが、赤いCubeにRigidbodyをアタッチすることで、

赤いCubeが重力に従って落下し、途中で白いCubeに衝突していることが分かります。

なお、ここで赤いCubeの生成に用いたスクリプトは以下の通りです。ゲーム全体を管理するマネージャーオブジェクト(カラのGameObject)にアタッチしています。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class Manager : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        GameObject obj1 = GameObject.CreatePrimitive(PrimitiveType.Cube);
        obj1.name = "Cube1";
        obj1.transform.position = new Vector3(-1, 3, 1);  //赤いCubeの座標を指定する
        obj1.transform.rotation = Quaternion.Euler(10, 0, 0);   //赤いCubeの回転を指定する
        obj1.GetComponent<Renderer>().material.color = Color.red;  //赤いCubeの色を指定する
        Rigidbody rigidbody = obj1.AddComponent<Rigidbody>();  //Rigidbodyをアタッチする
    }
 
    // Update is called once per frame
    void Update()
    {
         
    }
}

Rigidbodyの設定項目

Rigidbodyのフィールドには次のようなものがあります。(一部のみ抜粋)

フィールド名説明
angularDragオブジェクトの回転抗力
angularVelocityオブジェクトの回転の角速度
dragオブジェクトの抗力
isKinematicオブジェクトが物理演算の影響を受けるかどうか
massオブジェクトの質量(単位:kg)
useGravityオブジェクトが重力の影響を受けるかどうか
velocityオブジェクトの速度(単位:m/s)

このフィールドの値をスクリプトから直接指定したり、取得することができます。

GameObjectに力を加える

GameObjectに力を加えるには、AddForceメソッドを用いて、力をベクトルで与えます。

AddForceで力を与えるのは1フレームのみなので、Startメソッドに記述すればそのオブジェクトがアクティブになったときに0.02秒間(30FPSの場合)だけ力が加えられることになります。FixedUpdateメソッドに記述すると、常に力が加えられている状態になります。

先ほどの赤いCubeに一定の力を加えてみましょう。下に落ちないようにベースとなる台を追加してから、以下のスクリプトをゲーム全体を管理するマネージャーオブジェクト(カラのGameObject)にアタッチしましょう。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
  
public class Manager : MonoBehaviour
{
    Rigidbody rigidbody;
 
    // Start is called before the first frame update
    void Start()
    {
        GameObject obj1 = GameObject.CreatePrimitive(PrimitiveType.Cube);
        obj1.name = "Cube1";
        obj1.transform.position = new Vector3(-1, 3, 1);  //赤いCubeの座標を指定する
        obj1.transform.rotation = Quaternion.Euler(10, 0, 0);   //赤いCubeの回転を指定する
        obj1.GetComponent<Renderer>().material.color = Color.red;  //赤いCubeの色を指定する
        rigidbody = obj1.AddComponent<Rigidbody>();  //Rigidbodyをアタッチする
    }
  
    void FixedUpdate()
    {
         rigidbody.AddForce(8,0,0);  //力を加える
    }
}

なお、UpdateメソッドとFixedUpdateメソッドの使い分けについては以下の記事をご覧ください。

スポンサーリンク

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)