Unityを使ったゲーム開発記録

Unityのゲーム開発などを中心に投稿していきます。何か参考になる様な記事ではなく自分用の備忘録になる為、生暖かい目で見て下さい。

Unityでのゲーム開発 〜エイムモーション編〜

f:id:mochisakucoco:20210503091741p:plain

武器構え時のモーション変更の実装


今回はエイム時のモーション設定を設定したいと思います。




まずは下準備として前の記事で武器をUpper Chestの子要素から一旦Root外まで戻します。
f:id:mochisakucoco:20210418045253p:plain






武器の角度調整が可能になる様に新しくPivotPointを設定します。

武器のPivotPointの設定

  • 武器内に新しいGameObjectを作成し「WeaponPivot」として位置を調整する
  • Toggle Tool Handle Positionのギズモの位置をCenterからPivotに変更しておく
  • WeaponPivotを武器の子要素から外し
  • 武器をWeaponPivot内の子要素に変更する


ハンドル、ギズモなどの詳細⇩
ゲームオブジェクトの配置 - Unity マニュアル

処理をまとめた物はこちら⇩
f:id:mochisakucoco:20210418045331g:plain

f:id:mochisakucoco:20210418045434g:plain

f:id:mochisakucoco:20210418045534g:plain





RigLayer_WeaponPoseの作成・調整


新しくRigLayerを追加していくやり方


  • 新しいRigLayerを作成するにあたり、現在作成しているRigLayerと区別する為に「RigLayer_HandIK」に名前を変更する
  • Playerにカーソルを合わせて新しくGameObjectを作成し「RigLayer_WeaponPose」にする
  • RigLayer_WeaponPoseのAdd Componentから「Rig」を取り付ける
  • PlayerのRigBuilderの+ボタンで新規の項目を追加
  • RigLayer_WeaponPoseを適用させて「RigLayer_HandIK」との位置を入れ替える

f:id:mochisakucoco:20210418060317g:plain


  • RigLayer_WeaponPoseにカーソルを合わせて新しくGameObjectを作成し「WeaponPose」に名前を変更する
  • WeaponPoseのAdd Componentから「Multi-Parent Constraint」を取り付ける
  • 取り付けたMulti-Parent Constraintの「Constrained Object」にWeaponPivot 「Source Objects」にWeaponPoseを適用する
  • WeaponPivotのTransformをコピーしてWeaponPoseのTransformに貼り付ける(*微調整が必要な場合はプレイモードで確認しながら調整を行う)
  • WeaponPoseのAdd Componentから「Multi-Position Constraint」を取り付ける
  • 取り付けたMulti-Position Constraintの「Constrained Object」にWeaponPose 「Source Objects」に『胸(上部)、武器、右肩、右上腕、右前腕、左肩、左上腕、左前腕』を適用する
  • Multi-Position ConstraintのSettingsの項目を開きMaintain Positionのチェックを外す
  • プレイモードで確認しながらOffsetの位置調整を行う


 

Multi-Parent Constraintのプロパティー

f:id:mochisakucoco:20210430122236p:plain
Multi-Parent Constraintは、階層ウィンドウ内の別のGameObjectの子であるかのように、GameObjectを移動および回転させる物

Weight・・・0に設定すると、GameObjectに影響を与えませんが、1に設定すると、GameObjectに影響を与えます。
Constrained Object・・・制約の影響を受けるGameObject
Source Objects・・・制約されたGameObjectの位置と方向に影響を与えるGameObjectのリスト
Maintain Offset・・・Noneに設定されていない場合は制約されたGameObjectからソースGameObjectへのオフセット(Position、Rotation、またはその両方)を維持するものになります
Constrained Position Axes・・・X、Y、Zをチェックして、コンストレイントが対応する位置軸を制御できるようにします
Constrained Rotation Axes・・・X、Y、Zをチェックして、コンストレイントが対応する回転軸を制御できるようにします





 

Multi-Position Constraintのプロパティー

f:id:mochisakucoco:20210430115702p:plain
位置制約コンポーネントは、GameObjectをそのソースGameObjectに従うように移動する様にできます

Weight・・・0に設定すると、GameObjectに影響を与えませんが、1に設定すると、GameObjectに影響を与えます。
Constrained Object・・・制約の影響を受けるGameObject
Constrained Axes・・・X、Y、Zをチェックすると、コンストレイントが対応する位置軸を制御できるようにできます
Source Objects・・・制約されたGameObjectの位置に影響を与えるGameObjectのリスト
Maintain Position Offset・・・制約されたGameObjectからSource Objectsへの現在の位置オフセットを維持するものになります
Offset・・・Constrained Objectに新しくポスト位置をオフセットする項目 *今回の記事で例えると武器をどの位置に持っていくかの数値になります






RigLayer_WeaponAimingの作成・調整


  • RigLayer_WeaponPoseにカーソルを合わせてコピー(⌘+C)して、貼り付け(⌘+D)でRigLayerを複製する Mac用の操作
  • 複製したものを「RigLayer_WeaponAiming」に名前を変更する
  • PlayerのRigBuilderの項目を増やしRigLayer_WeaponAimingを適用する
  • この際にRigBuilderの並び順を上から[RigLayer_WeaponPose]⇨[RigLayer_WeaponAiming]⇨[RigLayer_HandIK]に並び替える
  • コピーしたRigLayer_WeaponAiming内のWeaponPose(Multi-Position Constraint)のOffset数値を変更(数値などは画面見ながら調整が必要)
  • Multi-Position Constraintの「Source Objects」を『胸(上部)Upper Chest』のみ残して他は削除する


内容が問題なければ下記の様にRigLayer_WeaponAimingの「Rig」コンポーネントを調整して動きの確認が出来ると思います
f:id:mochisakucoco:20210422101313g:plain






 

Multi-Aim Constraintの取り付けと設定

  • 新しくAdd Componentから「Multi-Aim Constraint」を取り付けて位置を入れ替える

f:id:mochisakucoco:20210425155447g:plain

  • 取り付けたMulti-Aim Constraintの「Constrained Object」にWeaponPoseを適用
  • Aim AxisをZからXに変更
  • Main Camera にカーソルを合わせて新しくGameObjectを作成し「AimLookAt」に名前を変更
  • AimLookAtを Multi-Aim Constraintの「Source Objects」に適用して数値を調整する




    

Multi-Aim Constraintのプロパティー

f:id:mochisakucoco:20210502020345p:plain
Multi-Aim Constraintは、GameObjectを回転させてSource Objectsに向けます。これは他のGameObjectを追跡するために使用したりします。目的のベクトル(X、-X、Y、-Y、Z、-Z)に照準軸を指定することで、照準方向を決める事ができます。オプションで、ワールドアップ方向を指定して、Constrained Objectに適用したGameObjectが上向きの位置を維持できるようにすることも可能です

Weight・・・0に設定すると、GameObjectに影響を与えませんが、1に設定すると、GameObjectに影響を与えます。
Constrained Object・・・制約の影響を受けるGameObject
Aim Axis・・・前方方向をSource Objectsに向けるために使用する、Constrained Objectのローカル照準軸を指定する項目
Up Axis・・・上方向をSource Objectsに向けるために使用する、Constrained Objectsのローカル上軸を指定する項目
World Up Type・・・制約されたGameObjectの上方向を維持するために使用するモードを指定できます

  • None・・・World Up Typeを使用しない
  • Scene Up・・・sceneのY軸に適用する
  • Object Up・・・World Up Objectに適用したGameObjectのY軸
  • Object Up Rotation・・・World Up Objectに適用したGameObjectのローカル空間を基準としてWorld Up Vectorを定義する
  • Vector・・・World Up Vectorを使用して、ユーザーが指定したベクトルとして定義する

Source Objects・・・制約されたGameObjectの位置に影響を与えるGameObjectのリスト
Maintain Rotation Offset・・・制約されたGameObjectからSource Objectsへの現在の回転するオフセットを維持する状態にする
Offset・・・Constrained Objectに新しく回転後のオフセットを適用する項目
Constrained Axis・・・X、Y、Zをチェックして、対応する軸を制御できるようにする
Min Limit・・・GameObjectが回転する軸の最小値
Max Limit・・・GameObjectが回転する軸の最大値





RigLayer_BodyAimの作成・調整

  • Playerにカーソルを合わせて新しくGameObjectを作成し「RigLayer_BodyAim」にする
  • RigLayer_BodyAimのAdd Componentから「Rig」を取り付ける
  • PlayerのRigBuilderの+ボタンで新規の項目を追加
  • RigLayer_BodyAimを適用させて「RigLayer_BodyAim」の位置を一番上に替える
  • RigLayer_BodyAimにカーソルを合わせて新しくGameObjectを作成し「AimShoulder_L」にする
  • AimShoulder_LにAdd Componentから「Multi-Aim Constraint」を取り付けるて下記の内容を設定する
  1. Constrained Objectに[LeftShoulder]を適用
  2. Aim Axisを[-Y]に設定
  3. Source Objectsに[AimLookAt]を適用

*上記の設定完了後同じ様な設定を4つ作りたい為、AimShoulder_Lをコピーして4つ複製します、作成したGameObjectを「左上腕、左前腕、左手、頭」の順にConstrained Objectを変更する
f:id:mochisakucoco:20210504163134p:plain

*頭(Head)のSettingsのOffsetの数値をいじっています。


最終的な感じがこちら⇩
f:id:mochisakucoco:20210503084450g:plain



色々なConstraintを使用して動きに制約を加える事が出来るのは理解できたんですが文章にするとややこしくなる:(;゙゚'ω゚'):

Animatorだけでは実装出来ない動きも再現出来たりするので上手く使えばもっと綺麗なモーションに仕上げることも出来ると思います