「リジッドボディのコンストレイントをスクリプトから動的に制御したいけどどうすればいいの?」
今回はこの疑問を解決する方法を紹介していきます。
とても簡単だけど少しだけ注意が必要!そのポイントも含めて分かりやすくまとめてみました!
目次
制御のパターン
Constraintsを制御する方法は以下の表にまとめた
目的 | 方法(Constraintsに代入) | 結果 |
座標を制御 | FreezePositionX FreezePositionY FreezePositionZ FreezaPosition | X 軸の移動をさせない Y 軸の移動をさせない Z 軸の移動をさせない 全ての軸を移動させない |
回転を制御 | FreezeRotationX FreezeRotationY FreezeRotationZ FreezeRotation | X 軸の回転をさせない Y 軸の回転をさせない Z 軸の回転をさせない 全ての軸を移動させない |
制限を解除(移動も回転もする) | None | 制限なし |
全てを制限(移動も回転もしない) | FreezeAll | 移動と回転をさせない |
スクリプトで制御するサンプルコード
実際にサンプルコードを見て確認していきましょう。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class FreezeConstraints: MonoBehaviour
{
private Rigidbody _rb;
void Start()
{
_rb = GetComponent<Rigidbody>();
// 座標を制御
_rb.constraints = RigidbodyConstraints.FreezePositionX; //PositionのXのみオン
_rb.constraints = RigidbodyConstraints.FreezePositionY; //PositionのYのみオン
_rb.constraints = RigidbodyConstraints.FreezePositionZ; //PositionのZのみオン
_rb.constraints = RigidbodyConstraints.FreezePosition; //Positionを全てオン
// 回転を制御
_rb.constraints = RigidbodyConstraints.FreezeRotationX; //RotationのXのみオン
_rb.constraints = RigidbodyConstraints.FreezeRotationY; //RotationのYのみオン
_rb.constraints = RigidbodyConstraints.FreezeRotationZ; //RotationのZのみオン
_rb.constraints = RigidbodyConstraints.FreezeRotation; //Rotationを全てオン
// 制限を解除
_rb.constraints = RigidbodyConstraints.None; //制限なし
// 全てを制限
_rb.constraints = RigidbodyConstraints.FreezeAll; //移動も回転もしないようにする
}
}
フリーズする座標や軸を細かく指定したい場合は「|(or演算子)」で指定してあげるとうまくいきます。
// 制限を解除
_rb.constraints = RigidbodyConstraints.None; //制限なし
// 全てを制限
_rb.constraints = RigidbodyConstraints.FreezeAll; //移動も回転もしないようにする
// 制限する軸を細かく指定(PositionXとRotationのXをオン)
_rb.constraints =
RigidbodyConstraints.FreezePositionX | RigidbodyConstraints.FreezeRotationX;
まとめ
うまく制御できたでしょうか。細かく制御するとなると少し分かりにくいので気を付けて制御していきましょう。