Unity2018のConstraintってなんなのさ?

どんな機能なの?

  • オブジェクトの階層構造を作らずに、親子関係を擬似的に定義できる機能です
  • 複数のオブジェクトを親として持ち、割合で影響を与える事もできます

何に使えるの?

Humanoidボーンの枠組みの外のボーンの動きの定義ができる!

  • 多脚やサブアームの様な物を作ったり、補助ボーンを定義したりできます

オブジェクトの親子関係を擬似的に変更できる!

  • 背中に装備した剣(Chestに接続)をハンドサインで右手に持ち替え(Right Handに接続)したりできます
  • 一つのオブジェクトを使い回す事ができ、ポリゴン数など色々節約できます

ワールド座標に対して接続できる!

  • いわゆるワールド固定ギミックに使えます

その他

  • 複雑なギミックをアバターの浅い階層に持ってくるなど、他にも色々な使い方があります

いっぱいあるけど何が違うの?

使えるConstraint

  • Aim Constraint
  • Look At Constraint
  • Parent Constraint
  • Position Constraint
  • Rotation Constraint
  • Scale Constraint

何が違うの?

  • 一杯あるけど、実は機能的には3種類ぐらいです!

  • Aim Constraintの機能を省略してよくあるケースに特化した物がLook At Constraint

  • Parent ConstraintはPositionとRotationをよしなに調整して親子関係を作るための物

  • Positon/Rotation/Scale Constraintはそれぞれのワールド座標系に対するTransformを受け取る物

Parent Constraintって何?

  • 接続したオブジェクト間で、ワールド座標系に対するTransformのPositionとRotationを一致させる機能です

  • 擬似的なオブジェクトの親子関係を作るために使います

  • これ単体ではScaleは接続されないので、必要に応じて別途Scale Constraintで接続します

  • Position/Rotation Constraintを使った場合と異なり、SourceのRotationに併せてPositionが動きます(オブジェクトを親子関係にして、親を回転したときの挙動と同じ)

Position/Rotation/Scale Constraintって何?

  • 接続したオブジェクトのワールド座標系に対するTransform情報を受け取ります

  • Parent Constraintと異なり、PosititonとRotationを併用している場合でも、Sourceに指定したオブジェクトを回転させたとき、Positionは動きません

Aim Constraintって何?

  • 多分これが一番複雑です

  • コンポーネントをつけたオブジェクトとSourceのPositionを、Rotationに変換します

  • 特定のオブジェクトをターゲットし続けるカメラの様な物への利用が想定されており、デフォルトのパラメータでは下記の様な動きをします

    • オブジェクトのローカル座標系でZ軸の+方向を、Sourceに指定したオブジェクトに向け続ける

    • ワールド/ローカル座標系におけるZ軸に対する回転を制限する

    • イメージとしては、正面に向けてカメラを持った状態で指定した物を写し続ける様な感じです

    • その際、ハンドルを回す様な方向の回転は加えず、水平を保ち続けます。

  • Look At ConstraintはAim Constraintを簡略化した物です

    • ローカル座標系Z軸+方向をSourceに向け続け、Z軸に対する回転をRollで指定します
  • Aim Constraintは挙動をある程度細かく制御できます。

    • Aim Vectorでローカル座標系のどの方向をSourceに向け続けるかを選択
    • Up Vectorでローカル座標系における上側がどの面かを選択
    • World Up Typeでワールド座標系の上側を指定する方法を選択
      • タイプによって、上側として指定するベクトルや、オブジェクトを選択
  • Aim Constraintは2つのObjectのPositionの差異をRotationに変換しつつ、ローカル座標系における1軸を固定できます。

  • この挙動を利用すると、X軸とZ軸のRotationは同期させつつ、Y軸の回転を無視する様な挙動が実現できます。

  • これを応用したものが、足を捻っても壊れないInside Colliderのスカートです。

    • コライダーの親をUpperLegにPosition Constraintで接続し、AimConstraintでLower Legを向け続け、2点のPositionをRotationに変換しています。
    • その際、World Up TypeをObject Rotaiton Upとし、Hipsの体の正面側の面をワールド座標における上、UpVectorでコライダーの親の体の正面側をローカル座標における上としています。
    • こうする事で、ローカル座標系におけるY軸に対する回転がロックされ、X軸とZ軸の回転のみがコライダーの親オブジェクトに伝わる様になります。