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メソッドの使い分けについては以下の記事をご覧ください。
コメント