DazStudioのモーフ機能をUnityで使う

# 概要
DazStudioのモーフ機能をUnityで使えるようにします。

下gifアニメはDazStudioのモーフ機能で体型を変更している様子です。
これと同じ操作をUnityEditorで行いたい。
![dazMorph.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/9fe726e6-a5d0-68d9-d38d-23c05c6be328.gif)

# 開発環境
Unity:2021.3.9
DazStudio:4.21
IDE:Rider
UniTask:2.3.3

# 手順

## DazStudio側
 ## Daz to Unity Bridgeのインストール
 https://www.daz3d.com/daz-to-unity-bridge
無料
要ユーザー登録

 ## Daz to Unity bridegeでエクスポート
適当に服を着せたGenesis8をエクスポートします。
上部ツールバーのFile→Send To→ Daz to Unityを選択します。
ウィンドウが表示されるので、下の画像になるように設定します。
UnityAssets Folderは対応するUnityプロジェクトのパスにします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/0f41fc54-2ee6-d2f3-433c-017efa19126b.png)

ChooseMorphをクリックすると以下ウィンドウが表示され、Unity側で使いたいmorphを追加します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/4c31f8bc-48c8-8540-3e2e-2bf4eb4dbfef.png)


## Unity側でmorphが入っているか確認
ピンク色のシルエットみたいなプレファブが追加されていると　エクスポート成功です。（モーフ機能も追加されたとは言っていない。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/8b15a143-89c1-5a6b-bf2b-0da6f4b4bd84.png)

ピンク色のシルエットだとわかりにくいので、.._baseファイルをヒエラルキー上に移します。

![dazMorphToUnity.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/779ba8fa-d0a2-fd94-e1ec-2c68ede8a289.gif)


子オブジェクトの*.Shapeに含まれているSkinnedMeshRendererコンポーネントがDazStudioのモーフ機能に相当します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/4d1433f1-ec1f-6762-1b05-617393397e1d.png)




## Unity側
 ## 動作確認そして問題点
unity上で人体のモーフを動かすと服を貫通し肌が露出します。
人体のBlendShapeが変化しているのに対して、服のBlendShapeが変化してないのが原因です。
DazStudioでは自動でやってくれます。
以下のgifアニメは体のモーフだけを変えたときの様子です。
![dazMorphPloglem.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/f0d623c3-bb6b-5b08-cce0-49344b15c74a.gif)



 ## 問題の対処
　スライダのGUI作って制御します。
### スクリプト
``` MorphChange.cs

using System.Collections.Generic;
using Cysharp.Threading.Tasks;
using UnityEngine;
using UnityEngine.UI;
public class MorphChanger : MonoBehaviour
{
    [SerializeField] private List<SkinnedMeshRenderer> _skinnedMeshRenderers;
    [SerializeField] private  Slider[] _slider;
    // Start is called before the first frame update
    private void Start()
    {
        _ = ChangeMorph();
    }
    
    private  async UniTask ChangeMorph()
    {
        while (true)
        {
             var result = await UniTask.WhenAny(_slider.Select(async x => await x.OnValueChangedAsync()));

            // float value = await _slider[result.winArgumentIndex].OnValueChangedAsync();
            foreach (var render in _skinnedMeshRenderers)
            {
                render.SetBlendShapeWeight(result.winArgumentIndex,result.result);
            }
        }
    }
}


```

以下GIFアニメは、Unity上でモーフを動かしている様子です。
![morphComplete.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/8c2118de-48d9-b476-dfb0-9c785f34c051.gif)

# 所見
DazStudioでエクスポートするところで詰まりましたね。モーフだけ抜かれている現象が起こってました。
自分の場合はUnity Plugin Iinstallerのところを変更したら上手くいきました。
他の人も苦労してるようで中々癖のある機能みたいですね。（参考のURL参照）

あとはDazのアニメーションをUnityで使えれば満足かな…

# 参考
DazStudio

https://www.daz3d.com/forums/discussion/348226/please-help-importing-to-unity-morphs-missing

https://www.daz3d.com/forums/discussion/441857/unity-introducing-the-all-new-daz-to-unity-bridge-native-unity-file-formats/p2


C# LINQの書き方

https://www.hanachiru-blog.com/entry/2021/02/11/120000