FinalIKでキャラクターに思いのままにインタラクションさせる方法

#使用アセット

##Final IK
Final IK
https://assetstore.unity.com/packages/tools/animation/final-ik-14290
##背景
Fantasy Forest Environment
https://assetstore.unity.com/packages/3d/environments/fantasy/fantasy-forest-environment-34245
##モデル
京狐
https://booth.pm/ja/items/1826902
##アニメーション
Magician-Motion Pack
https://assetstore.unity.com/packages/3d/animations/magician-motion-pack-133515

##インタラクションの参考
Final IKインタラクションのチュートリアル
https://www.youtube.com/watch?v=r5jiZnsDH3M

#足を接地
Sceneに配置したモデルにFull Body Biped IKを設定
※基本的には自動で設定されるがモノによっては設定が上手くいかないものがある。
![01.png](https://drive.google.com/uc?export=view&id=16DoYAxjCLpdw_ylabfxzH7mfrmW39Xzw)

上手く設定できるとこんな感じになる
![02.png](https://drive.google.com/uc?export=view&id=1Ds2vuTahwgmfJAWUvAZGESvykkAAGom5)

床用のレイヤーを追加し、接地させるようのメッシュにレイヤーを設定する。
今回はGroundレイヤーを追加し、地面に設定した。
![03.png](https://drive.google.com/uc?export=view&id=1iNB3RpJdP_Bi5qEzEsczITcAZ_bzs0_Z)

Grounder Full Body Bipedをモデルにアタッチする。
Grounder Full Body BipedのIKにFull Body Biped IKをアタッチする。
Solverを開き、Layersに接地用レイヤーを設定する。今回はGroundを追加した。
![04.png](https://drive.google.com/uc?export=view&id=17MC8d9q1NBug06uJE3Luq32Tl-KX5ksH)

設定するとこんな感じになる。
![01.gif](https://drive.google.com/uc?export=view&id=15X-TKtXncdq9u2CYG5HPCPzrh8C3u7I4)


#IKだけでオブジェクトに片手を触れて放す
アイドルモーション用に使っていたAnimatorコンポーネントをオフにする
![05.png](https://drive.google.com/uc?export=view&id=1XTr-519Q2ar_yA4qpzo8eeLYY6ZQhw5D)

オブジェクトにInteractionObjectをアタッチ
![06.png](https://drive.google.com/uc?export=view&id=1yILkISPSQodKOsgDh9fLeUuZehJgY3KA)

Weight Curvesを追加しTypeはPosition Weightを選ぶ
Curvesは(Time,Value)でKeyを(0, 0) > (0.5, 1) > (1, 0)と設定した。
※0秒から0.5秒にかけて目標座標に到達し、0.5秒から1秒にかけて元に戻るようなカーブです。
![07.png](https://drive.google.com/uc?export=view&id=175AmOyyUBYoFSBwCwFZNVUQJO2IksNXA)

インタラクションさせるモデルにInteractionSystemをアタッチする
Full Bodyにはモデルに設定したFull Body Biped IKを設定する
![08.png](https://drive.google.com/uc?export=view&id=16NhpDrgtEpn1COZ9f11XdirlMj56JFrZ)

InteractionSystemTestGUIをアタッチする
※ゲームビューにInteractionSystemを実行するためのボタンが追加されます。

FinalIKの動作テスト用に同梱されたスクリプトであり、任意のタイミングでインタラクションするにはスクリプトの修正が必要です。
Interaction ObjectにInteraciton Objectをアタッチしたのを設定する
Effectorsを増やしRight Handを選択する
※これで右手にInteractionを適用することができる
![09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261340/afac56b7-73dc-5297-1286-3a0976c88fb2.png)

動かすとこんな感じ
![4.gif](https://drive.google.com/uc?export=view&id=1Fx6DUWnvj9WRwRmqs9urc8OrAHWWU6DD)

#IKだけでオブジェクトに両手を触れて放す
上の章(IKだけでオブジェクトに片手を触れて放す)で紹介した工程をしたあとに
InteractionSystemTestGUIのEffectorsを増やし
RightHandとLeftHandを設定するだけです。
![11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261340/53df81bb-1281-8f04-146f-7e5ea33b14bc.png)

動かすとこんな感じ
![7.gif](https://drive.google.com/uc?export=view&id=1hu73EyKrE2vDZXROhP5sBEJySfj_MpSk)


#IKだけでオブジェクトに片手を触れ続ける
上の章(IKだけでオブジェクトに片手を触れて放す)で紹介した工程をしたあとに
Interaction ObjectのEventsを追加し
Timeを0.5
Pauseにチェックを入れる
![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261340/d09c193b-0c15-9423-ef22-162b706eab0e.png)



動作としてはWeightCurvに従って0.5秒かけてオブジェクトに手を近づけ、
Evetntsで設定されたPauseが呼ばれる動作です
Curvを伸ばし、Timeを調整することでタイミングを調整できます。

動かすとこんな感じ
![5.gif](https://drive.google.com/uc?export=view&id=1FJYbBWbx2dIv0NLnrVHmCQptefzhJuqn)

#IKだけでオブジェクトに両手で触れ続ける
上の章(IKだけでオブジェクトに片手を触れ続ける)で紹介した工程をしたあとに
InteractionSystemTestGUIのEffectorsを増やし
RightHandとLeftHandを設定するだけです。
![11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261340/53df81bb-1281-8f04-146f-7e5ea33b14bc.png)

動かすとこんな感じ
![6.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261340/cb6b455b-13d6-ccbd-0fca-67f896755de2.gif)

#IKだけでオブジェクトを片手で掴む
上の章(IKだけでオブジェクトに片手を触れて放す)で紹介した工程をしたあとに
![12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261340/c8ba46cd-204f-4676-0542-598f59a8ad2f.png)
動かすとこんな感じ
![8.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261340/083974f5-1dbd-2b66-0ec6-69af9954d724.gif)

#掴むオブジェクトの回転をモデルのボーンに適用する
Interaction ObjectのMultipliersを追加し以下のように設定する
Curve：Position Weight
Multiplier：1
Result：Rotate Bone Weight
![13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261340/c00fc4fe-016a-5c43-4455-5f1f02e8c97d.png)
動かすとこんな感じ
![9.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261340/b9e211ea-2084-6920-db3d-16feec3b6352.gif)
MultiPliersのCurveはWeight Curveで指定したCurveから選ぶ

#オブジェクトに手の位置を合わせる
モデルを複製し、複製したモデルの手(Hand)をオブジェクトの置きたい座標に移動させる
※この時手が伸びてるように見えるが問題はない
![14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261340/4fc0ba7b-d6b2-944b-5147-024254815375.png)
複製した手を置きたいオブジェクトの子階層に配置する
![15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261340/b439beb3-c86a-69a8-3bbe-dc26b0f6a1ba.png)
コピーしたモデルは削除してよい
オブジェクト直下に配置したHandにInteractionTargetをアタッチし以下のように設定
EffectType：RightHand
※合わせるのに使用した部位を選ぶ
![16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261340/2acef3a0-f2bc-4071-478f-c55b6008bccc.png)
動かすとこんな感じ
![10.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261340/e7fa29fb-87a6-eb46-d369-2a53f3a1d837.gif)

ポジションはあってるが回転があってないのでWeight Curveを追加し、Rotation Weightを追加する
![17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261340/0f1a1cad-6c8c-ae5b-cd43-da7056edeacd.png)
動かすとこんな感じ
![11.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261340/e5eef4ac-13b3-176c-647a-d82fa43b608d.gif)

#オブジェクトに指の位置を合わせる
モデルの合わせたい指がある手(Hand.R)にHandPoserをアタッチ
![18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261340/5c6adeec-8af7-83bf-7f60-ba549686cc8e.png)


調整するときはゲームを再生し、IK適用後にオブジェクト直下に配置してるHandの指を動かす
![12.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261340/6cd43ec4-8f2d-dc69-8ab3-10b8dfecc8d6.gif)

調整したHandオブジェクトをコピーして再生を終了する
コピーしたオブジェクトに置き換える

位置によって手首がねじれるのでオブジェクトのInteractionTargetに
Pivot:インタラクションするオブジェクト
※再生中にTwistAxisを調整してコピペして角度合わせるのも有効
Rotate Once:チェックをつけると常に角度が修正されるようになる
![19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261340/813424a0-365d-c1ab-45df-7b003b1f841a.png)

動かすとこんな感じ
![13.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261340/22bf8585-0ece-ccb2-e5ac-4535a8d4b42b.gif)

#手を動かすときのY座標のオフセットを指定する
オブジェクトのInteractionObjectのWeightCurvを追加する
Y座標のオフセットを修正する際にはPosition OffsetYにする
Curvesは(Time,Value)でKeyを(0, 0) > (0.25, 1) > (0.5, 0)と設定した。
※0秒から0.25秒にかけてオフセットのYに到達し、0.25秒から0.5秒にかけて目的座標に戻るようなカーブです。
![20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261340/6a9ef505-04ee-7a6e-a7a8-cbaa39283e24.png)

動かすとこんな感じ
![14.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261340/bd6457f1-913c-7463-f4fe-80371c7024bb.gif)

#手を動かすときの腕の伸ばし具合のオフセットを指定する
オブジェクトのInteractionObjectのWeightCurvを追加する
腕の伸ばし具合のオフセットを修正する際にはReachにする
沢山伸ばしたい場合はValueを0に近づける
![21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261340/c4cc29ae-8b2b-d903-b0e7-f2d0d65b4347.png)
調整するときは再生してコピペでCurveを設定する
![16.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261340/e2d901c0-99f8-58a6-63f9-08ec518bca8d.gif)
Pauseを0.5としてるので
Curvesは(Time,Value)でKeyを(0, 0)  (0.5, 0.08)と設定した。
動かすとこんな感じ
![15.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261340/329720b6-562f-dcb1-84b0-14ceeb13b093.gif)