Developer

【初心者Unity】Rigidbodyのスクリプト操作で知っておきたいものまとめ
2022.02.28
Lv1

【初心者Unity】Rigidbodyのスクリプト操作で知っておきたいものまとめ

Rigidbodyのスクリプト


RigidbodyクラスにはRigidbodyオブジェクトを操作するためのスクリプトが用意されています。
今回はその中でも特に知っておいて欲しいものを紹介していきます。

力を加える(Rigidbody.AddForce)

Rigidbodyに力を加えるための関数です。
車の加速のような移動や、プレイヤーをジャンプさせたりする場合に適しています。
使用頻度高めの関数です。

■定義
public void AddForce (Vector3 force, ForceMode mode= ForceMode.Force);

forceは力を加える向き(ベクトル)です。
より強く力を加えたい場合は、forceに値を掛け合わせてベクトルを大きくします。

ForceModeはオプションとなっており、次の4つのモードが用意されています。

  • Force
  • Acceleration
  • Impulse
  • VelocityChange

・ForceMode.Force
質量(Massの値)を考慮して継続的に力を加え続けます。
オプション未指定の場合このモードがデフォルトとなります。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
using UnityEngine;
 
public class Rigidbody_Sample : MonoBehaviour {
 
    Rigidbody rb;
 
    void Start() {
        rb = GetComponent<Rigidbody>();
    }
 
    void FixedUpdate() {
        rb.AddForce(transform.right, ForceMode.Force);
    }
}

■補足
力を加え続けるため、処理を呼び続ければだんだんと移動が速くなります。
質量を考慮するため重いほど動きは鈍くなります。
車の加速の処理などに適しています。

・ForceMode.Acceleration
質量を無視して継続的に力を加え続けます。

・ForceMode.Impulse
質量を考慮して瞬間的に力を加えます。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
using UnityEngine;
 
public class Rigidbody_Sample : MonoBehaviour {
 
    Rigidbody rb;
 
    void Start() {
        rb = GetComponent<Rigidbody>();
    }
 
    void Update() {
        if (Input.GetButtonDown("Jump")) {
            rb.AddForce(transform.up, ForceMode.Impulse);
        }
    }
}

■補足
プレイヤーをジャンプさせるときなどに適しています。
サンプルの様にボタンを押したら一度だけ実行する使い方が一般的です。

・ForceMode.VelocityChange
質量を無視して瞬間的に力を加えます(=速度が一瞬で変わります)

速度を変更する(Rigidbody.velocity)

Rigidbodyの速度の値です。
これを変更するとオブジェクトの速度が直接変更されます。
速度自体を変更してしまうので質量は関係ありません。
プレイヤーの移動処理などに適しており、こちらも使用頻度は高めです。

■定義
public Vector3 velocity ;
Vector3型で定義されています。

■サンプル

水平方向の入力値を使って速度を変更し、オブジェクトを移動させます。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
using UnityEngine;
 
public class Rigidbody_Sample : MonoBehaviour {
 
    Rigidbody rb;
 
    void Start() {
        rb = GetComponent<Rigidbody>();
    }
 
    void Update() {
        Vector3 v = rb.velocity;
        v.x = Input.GetAxis("Horizontal");
        rb.velocity = v;
    }
}

■補足
速度をより速くしたい場合は、Vector3の値を大きくします。

質量(Rigidbody.mass)

重さです。

■定義

public float mass ;

■サンプル
質量を10.5に更新しています。

1
2
3
4
5
6
7
8
9
10
11
using UnityEngine;
 
public class Rigidbody_Sample : MonoBehaviour {
 
    Rigidbody rb;
 
    void Start() {
        rb = GetComponent<Rigidbody>();
        rb.mass = 10.5f;
    }
}

■補足

「重いほど速く落下する」は間違いです。

物理演算のON/OFF(Rigidbody.isKinematic)

物理演算の影響を受けるかどうかの値です。
無効化した場合、そのRigidbodyは物理演算の影響を受けなくなります。
つまり、重力があっても落下せず、他のRigidbodyオブジェクトが衝突しても微動だにしません。

■定義

public bool isKinematic ;
bool型です。trueを与えると有効化、falseで無効化です。

■サンプル

1
2
3
4
5
6
7
8
9
10
11
12
using UnityEngine;
 
public class Rigidbody_Sample : MonoBehaviour {
 
    Rigidbody rb;
 
    void Start() {
        rb = GetComponent<Rigidbody>();
        rb.isKinematic = true// 有効化
        rb.isKinematic = false; // 無効化
    }
}

■補足
物理演算と絡みがあるけど動かないオブジェクト(衝突できる巨大な岩など)に使います。
また一時的に動作を止めたりする場合にも適しています。

以上、Rigidbodyスクリプトのよく使うところの紹介でした。

Unity実践編 - 目次リンク

実践Unityゲームプログラミング 連載目次