概要
DazStudioのモーフ機能をUnityで使えるようにします。
下gifアニメはDazStudioのモーフ機能で体型を変更している様子です。
これと同じ操作をUnityEditorで行いたい。
開発環境
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プロジェクトのパスにします。
ChooseMorphをクリックすると以下ウィンドウが表示され、Unity側で使いたいmorphを追加します
Unity側でmorphが入っているか確認
ピンク色のシルエットみたいなプレファブが追加されていると エクスポート成功です。(モーフ機能も追加されたとは言っていない。)
ピンク色のシルエットだとわかりにくいので、.._baseファイルをヒエラルキー上に移します。
子オブジェクトの*.Shapeに含まれているSkinnedMeshRendererコンポーネントがDazStudioのモーフ機能に相当します。
Unity側
動作確認そして問題点
unity上で人体のモーフを動かすと服を貫通し肌が露出します。
人体のBlendShapeが変化しているのに対して、服のBlendShapeが変化してないのが原因です。
DazStudioでは自動でやってくれます。
以下のgifアニメは体のモーフだけを変えたときの様子です。
問題の対処
スライダのGUI作って制御します。
スクリプト
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上でモーフを動かしている様子です。
所見
DazStudioでエクスポートするところで詰まりましたね。モーフだけ抜かれている現象が起こってました。
自分の場合はUnity Plugin Iinstallerのところを変更したら上手くいきました。
他の人も苦労してるようで中々癖のある機能みたいですね。(参考のURL参照)
あとはDazのアニメーションをUnityで使えれば満足かな…
参考
DazStudio
C# LINQの書き方