【Unity】RigidbodyのConstraints(制限)を変えて実験
- 2018.05.17
- Rigidbody
- Constraints, Rigidbody, Unity
Rigidbodyを使って物理演算をさせたい時でも、いくらか制約をかけたいことがあります。
例えば、衝突した後に変な方向へ飛んでいかないよう、Z軸の運動を制限したり。
それを可能にする設定が、RigidbodyのConstraintsです。位置と回転について制限をつけることが可能なので、完全に自由な物理運動をさせるのではなく、ある程度制御したい時に便利です。
環境
macOS 10.13 High Sierra
Unity2018.1.0f2
4月末にUnity2018が出てたので早速使ってみました。
Rigidbodyについて
Rigidbodyのアタッチ方法や各設定項目の説明は、以下の記事で解説しています。
ざっくり言うと、Unityで物理演算を使うために必要なコンポーネントです。
今回はその中でもConstraints(制限)がテーマ。
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軸の運動だけになるので、画面奥方向にジャンプするような動きになりました。
次はY軸方向の制限です。飛び上がれないので、地面を転がる形になりました。
Z軸方向の制限です。画面奥にはいけないのでX軸方向にジャンプ。
ここから2軸縛り。XY軸の両方を制限しているので、Z軸方向に転がるだけです。なお、Y軸が制限されているため、地面のない部分にさしかかってもその高さで転がり続けます。
テキストでは設定値が6になっていますが、X軸の固定に対応するintが2, Y軸は4, Z軸は8のようで、縛った軸の合計値が表示されます。1つの軸だけなら文字列で表現されるのにね。
XZ軸の制限。Y軸方向のジャンプだけになります。Xが2, Zが8で設定値は10。
YZ軸の制限。X軸方向に転がります。Yが4, Zが8で設定値は12。
最後に究極の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軸縛りは結構使えます。
ゲーム開発の攻略チャートを作りました!
-
前の記事
【Unity】RigidbodyのCollision Detection(衝突の検知)を変えて実験 2018.05.17
-
次の記事
【Unity】Colliderってどんな種類があるの? ってときに読む記事【解説】 2018.05.19
コメントを書く