【Unity】RigidbodyのConstraints(制限)を変えて実験

【Unity】RigidbodyのConstraints(制限)を変えて実験

Rigidbodyを使って物理演算をさせたい時でも、いくらか制約をかけたいことがあります。

例えば、衝突した後に変な方向へ飛んでいかないよう、Z軸の運動を制限したり。

それを可能にする設定が、RigidbodyのConstraintsです。位置と回転について制限をつけることが可能なので、完全に自由な物理運動をさせるのではなく、ある程度制御したい時に便利です。

 

環境

macOS 10.13 High Sierra

Unity2018.1.0f2

4月末にUnity2018が出てたので早速使ってみました。

Rigidbodyについて

Rigidbodyのアタッチ方法や各設定項目の説明は、以下の記事で解説しています。

ざっくり言うと、Unityで物理演算を使うために必要なコンポーネントです。

今回はその中でもConstraints(制限)がテーマ。

Rigidbodyのパラメータ
Rigidbodyのパラメータ

 

Constraints(制限)について

Constraintsは日本語訳すると「制限」とか「制約」といった意味を持ちます。Xcodeを使って開発を行ったことのある人だと聞いたことがあるかも。

Unityでは、位置の固定や回転の固定に使われます。

例えばX-Y平面だけでゲームを動かしたいときには、Z軸方向に移動させたくない場合があります。そんなときにこのConstraintsでFreeze PositionのZ軸にチェックを入れれば、Z軸方向に運動しなくなります。

見た目は3Dのオブジェクトだけど、移動できる方向は2Dのアクションゲームで使えるかな。『New! スーパーマリオブラザーズ』のステージのようなイメージです。

チェックした軸方向の運動を制限できるのがいいところ。たとえUseGravityをtrueにしていても、Freeze PositionでYにチェックを入れていれば、落下しなくなります。

回転も同様で、チェックした軸方向に回転しないようになります。例えばQuadで画像を表示している時に、変な方向で回転しないように制限をかけておくと安心です。

 

斜方投射で位置の制限

X軸、Y軸、X軸それぞれの方向に力を加えて、斜方投射してみましょ。

この時、軸の制限を加えて違いを観察してみます。

設定項目の組み合わせが多いため、用意したボールも以下の8種類となりました。

  • Constraints / Freeze Position : なし
  • Constraints / Freeze Position : X
  • Constraints / Freeze Position : Y
  • Constraints / Freeze Position : Z
  • Constraints / Freeze Position : XY
  • Constraints / Freeze Position : XZ
  • Constraints / Freeze Position : YZ
  • Constraints / Freeze Position : XYZ

 

Constraintsの設定のみ変え、他の値はRigidbodyのデフォルトのままとします。

これらのボールに、同時に力を与えた時の運動を観察。ForceModeはImpulseとし、加えた力の大きさは画面左上に表示しています。

画面水平方向がX軸、画面鉛直方向がY軸、画面の奥行きがZ軸です。

まずはX軸の制限から。比較のため、制限のないボールと一緒に飛ばしています。Y軸とZ軸の運動だけになるので、画面奥方向にジャンプするような動きになりました。

X軸方向の制限
X軸方向の制限

 

次はY軸方向の制限です。飛び上がれないので、地面を転がる形になりました。

Y軸方向の制限
Y軸方向の制限

 

Z軸方向の制限です。画面奥にはいけないのでX軸方向にジャンプ。

Z軸方向の制限
Z軸方向の制限

 

ここから2軸縛り。XY軸の両方を制限しているので、Z軸方向に転がるだけです。なお、Y軸が制限されているため、地面のない部分にさしかかってもその高さで転がり続けます。

テキストでは設定値が6になっていますが、X軸の固定に対応するintが2, Y軸は4, Z軸は8のようで、縛った軸の合計値が表示されます。1つの軸だけなら文字列で表現されるのにね。

XY軸方向の制限
XY軸方向の制限

 

XZ軸の制限。Y軸方向のジャンプだけになります。Xが2, Zが8で設定値は10。

XZ軸方向の制限
XZ軸方向の制限

 

YZ軸の制限。X軸方向に転がります。Yが4, Zが8で設定値は12。

YZ軸方向の制限
YZ軸方向の制限

 

最後に究極の3軸縛り。XYZ軸全てで制限がかかっています。世界樹の迷宮で頭、腕、足を全部縛るあの感じ。全部制限されたら動けません。

凍れる時間の秘法
凍れる時間の秘法

 

回転の制限

制限できるのは位置だけではなく回転も。

こっちも設定項目の組み合わせが多いため、以下の8種類の立方体を用意。ボールだと回転が分かりにくいもんね。

  • Constraints / Freeze Rotation : なし
  • Constraints / Freeze Rotation : X
  • Constraints / Freeze Rotation : Y
  • Constraints / Freeze Rotation : Z
  • Constraints / Freeze Rotation : XY
  • Constraints / Freeze Rotation : XZ
  • Constraints / Freeze Rotation : YZ
  • Constraints / Freeze Rotation : XYZ

全てのオブジェクトにConstantForceコンポーネントをアタッチし、(50.0f, 40.0f, 30.0f)のトルクをかけています。UseGravityはfalseにしたので空中に浮いています。

画面上段の左から、制限なし、X軸の制限、Y軸の制限、Z軸の制限です。

画面下段は左から、XY軸の制限、XZ軸の制限、YZ軸の制限、XYZ軸の制限です。下段の方が分かりやすいと思います。

なお、2軸縛りの設定値は位置と同様にintの足し算になっており、X軸の回転が16、Y軸の回転が32、Z軸の回転が64となっているようです。

目が回りそう
目が回りそう

 

意図しない方向への回転を防ぐ意味では、2軸縛りを使うのがいいかも。

まとめ

指定した軸方向の運動を制限するRigidbodyのConstraintsについての実験でした。

個別に画像を用意していることから予想がついたかもしれませんが、私はだいたいFreeze Positionを使っています。回転の固定ってあまり使い所が思いつかなくて……。

あ、でも回転の2軸縛りは結構使えます。

アセット作ってます!

CTA-IMAGE

Unityでの開発に役立つアセットを作っています。

3DダンジョンRPGを開発するスピードを200%加速するAssetや、ファンタジーRPGのダンジョンを彩るパーツを取り揃えています。

特に3DダンジョンRPGのゲームを1から作るのは結構時間がかかります。ダンジョン部分の作成はこうしたアセットを使って、開発をブーストさせてみませんか?