Rigidbodyを停止するスクリプト

投稿者: | 2019-11-27

Rigidbodyで物理的に動くオブジェクトをスクリプトで停止させてみます。

停止させる方法

rb = GetComponent<Rigidbody>();
rb.isKinematic = true;

isKinematicをオンにすると物理的な動きが止まります。停止したときに速度が0になります。


その後、isKinematicをオフにするとそのまま落下します。

isKinematicを変えずに速度を0にしてしまう方法もあります。

rb.velocity = Vector3.zero;
rb.angularVelocity = Vector3.zero;

そのまますぐに落下します。

元の速度で再開させる方法

Vector3 velocity;
Vector3 angularVelocity;
------
if (rb.isKinematic)
{
	rb.isKinematic = false;
	rb.velocity = velocity; // 一時停止直前の速度に戻す
	rb.angularVelocity = angularVelocity; // 一時停止直前の角速度に戻す
}
else {
	velocity = rb.velocity; // 速度を保存
	angularVelocity = rb.angularVelocity; // 角速度を保存
	rb.isKinematic = true;              
}

動いているときは今の速度を保存して一時停止し、停止しているときは、保存した速度に戻して再開します。


一連の動きが保持されています。

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

public class sphereScript2 : MonoBehaviour
{
    Rigidbody rb;
    public float power;

    Vector3 startPosition;
    Quaternion startRotation;

    Vector3 velocity;
    Vector3 angularVelocity;


    // Start is called before the first frame update
    void Start()
    {
        rb = GetComponent<Rigidbody>();
        startPosition = transform.position; // スタート時の位置
        startRotation = transform.rotation; // スタート時の回転
    }

    // Update is called once per frame
    void Update()
    {
        // Eキーを押した時(Sphereを発射)
        if (Input.GetKeyDown(KeyCode.E))
        {
            rb.isKinematic = true; 
            transform.position = startPosition; // スタート時の位置に戻す
            transform.rotation = startRotation; // スタート時の回転に戻す

            rb.isKinematic = false; 
            rb.AddForce(Vector3.Lerp(transform.right, transform.up, 0.7f) * power, ForceMode.Impulse); // Sphereを飛ばす
        }

        // Rキーを押した時(isKinematicをオンオフ)
        if (Input.GetKeyDown(KeyCode.R))
        {
            rb.isKinematic = !rb.isKinematic; // isKinematic を切り替える
        }

        // Fキーを押した時(速度をゼロにする)
        if (Input.GetKeyDown(KeyCode.F))
        {
            rb.velocity = Vector3.zero; // 速度を0にする
            rb.angularVelocity = Vector3.zero; // 角速度を0にする
        }

        // Vキーを押した時(停止、速度を戻して再開)
        if (Input.GetKeyDown(KeyCode.V))
        {
            if (rb.isKinematic)
            {
                rb.isKinematic = false;
                rb.velocity = velocity; // 一時停止直前の速度に戻す
                rb.angularVelocity = angularVelocity; // 一時停止直前の角速度に戻す
            }
            else {
                velocity = rb.velocity; // 速度を保存
                angularVelocity = rb.angularVelocity; // 角速度を保存
                rb.isKinematic = true;              
            }
        }
    }
}

キーボード入力で発射や一時停止、再開ができます。
Eキーでいつでも発射でき、Rキーだけで最初の方法、Fキーだけで二番目の方法、Vキーだけで三番目の方法が試せます。

インスペクタから発射の力の大きさを設定します。

コメントを残す

メールアドレスが公開されることはありません。