fix SetupAsync

This commit is contained in:
ousttrue 2021-09-09 17:45:27 +09:00
parent df59ac1979
commit fbcf4279bf
4 changed files with 59 additions and 46 deletions

View File

@ -29,6 +29,9 @@ namespace UniVRM10
}
}
List<SkinnedMeshRenderer> _created = new List<SkinnedMeshRenderer>();
public IReadOnlyList<SkinnedMeshRenderer> Created => _created;
// If no layer names are set, use the default layer IDs.
// Otherwise use the two Unity layers called "VRMFirstPersonOnly" and "VRMThirdPersonOnly".
public static bool TriedSetupLayer = false;
@ -90,7 +93,7 @@ namespace UniVRM10
/// <param name="visible"></param>
/// <param name="awaitCaller"></param>
/// <returns></returns>
public async Task SetupAsync(GameObject go, bool visible, IAwaitCaller awaitCaller = null)
public async Task<IReadOnlyList<SkinnedMeshRenderer>> SetupAsync(GameObject go, IAwaitCaller awaitCaller = null)
{
if (awaitCaller == null)
{
@ -100,7 +103,7 @@ namespace UniVRM10
SetupLayers();
if (m_done)
{
return;
return Created;
}
m_done = true;
@ -121,9 +124,10 @@ namespace UniVRM10
// 頭を取り除いた複製モデルを作成し、1人称用にする
var headless = await CreateHeadlessMeshAsync(smr, eraseBones, awaitCaller);
headless.enabled = visible;
headless.enabled = false;
headless.gameObject.layer = FIRSTPERSON_ONLY_LAYER;
headless.transform.SetParent(smr.transform, false);
_created.Add(headless);
}
else
{
@ -164,6 +168,8 @@ namespace UniVRM10
break;
}
}
return Created;
}
}
}

View File

@ -1049,10 +1049,9 @@ MonoBehaviour:
m_GameObject: {fileID: 1148284494}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 03b059a6d90275246ba8622ac40a63dc, type: 3}
m_Script: {fileID: 11500000, guid: bd151410f22d0f6409cf4b17c03a3c6e, type: 3}
m_Name:
m_EditorClassIdentifier:
m_loadAsync: 1
m_canvas: {fileID: 2082684588}
m_faceCamera: {fileID: 1919635064}
m_source: {fileID: 0}
@ -1447,7 +1446,7 @@ MonoBehaviour:
m_GameObject: {fileID: 1919635062}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: d1cc319f70f55264eb38d1959c4222c6, type: 3}
m_Script: {fileID: 11500000, guid: b74319fb726e30c4ca99bd741af8bd3c, type: 3}
m_Name:
m_EditorClassIdentifier:
Target: {fileID: 0}
@ -1754,7 +1753,7 @@ MonoBehaviour:
m_GameObject: {fileID: 2082684583}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 1ae08a6ba07c0864c9132bc8a004030d, type: 3}
m_Script: {fileID: 11500000, guid: 58bd4ef7b3a863142ae9960c21106ba3, type: 3}
m_Name:
m_EditorClassIdentifier:
LoadVRMButton: {fileID: 2036452539}

View File

@ -1,4 +1,5 @@
#pragma warning disable 0414
using System.Collections.Generic;
using System.IO;
using System.Threading.Tasks;
using UniGLTF;
@ -21,27 +22,23 @@ namespace UniVRM10.FirstPersonSample
[SerializeField]
UniHumanoid.HumanPoseTransfer m_target;
[SerializeField, Header("runtime")]
VRM10Controller m_firstPerson;
async Task SetupTargetAsync(UniHumanoid.HumanPoseTransfer m_target, bool visible)
void SetupTarget(UniHumanoid.HumanPoseTransfer m_target)
{
if (m_target != null)
if (m_target == null)
{
m_target.Source = m_source;
m_target.SourceType = UniHumanoid.HumanPoseTransfer.HumanPoseTransferSourceType.HumanPoseTransfer;
return;
}
m_firstPerson = m_target.GetComponent<VRM10Controller>();
m_target.Source = m_source;
m_target.SourceType = UniHumanoid.HumanPoseTransfer.HumanPoseTransferSourceType.HumanPoseTransfer;
var animator = m_target.GetComponent<Animator>();
if (animator != null)
var animator = m_target.GetComponent<Animator>();
if (animator != null)
{
if (m_faceCamera != null)
{
await m_firstPerson.Vrm.FirstPerson.SetupAsync(m_firstPerson.gameObject, visible);
if (m_faceCamera != null)
{
m_faceCamera.Target = animator.GetBoneTransform(HumanBodyBones.Head);
}
m_faceCamera.Target = animator.GetBoneTransform(HumanBodyBones.Head);
}
}
}
@ -72,34 +69,45 @@ namespace UniVRM10.FirstPersonSample
return;
}
// GLB形式でJSONを取得しParseします
// VRM extension を parse します
var data = new GlbFileParser(path).Parse();
Vrm10Data.TryParseOrMigrate(data, true, out Vrm10Data vrm);
using (var context = new Vrm10Importer(vrm))
var instance = await LoadAsync(path);
var root = instance.gameObject;
root.transform.SetParent(transform, false);
// add motion
var humanPoseTransfer = root.AddComponent<UniHumanoid.HumanPoseTransfer>();
if (m_target != null)
{
// metaを取得(todo: thumbnailテクスチャのロード)
var meta = vrm.VrmExtension.Meta;
Debug.LogFormat("meta: title:{0}", meta.Name);
GameObject.Destroy(m_target.gameObject);
}
m_target = humanPoseTransfer;
SetupTarget(m_target);
}
// ParseしたJSONをシーンオブジェクトに変換していく
var loaded = await context.LoadAsync();
async Task<RuntimeGltfInstance> LoadAsync(string path)
{
var data = new GlbFileParser(path).Parse();
if (!Vrm10Data.TryParseOrMigrate(data, true, out Vrm10Data vrm))
{
throw new System.Exception("vrm parse error !");
}
using (var loader = new Vrm10Importer(vrm))
{
var instance = await loader.LoadAsync();
var root = loaded.gameObject;
root.transform.SetParent(transform, false);
// add motion
var humanPoseTransfer = root.AddComponent<UniHumanoid.HumanPoseTransfer>();
if (m_target != null)
{
GameObject.Destroy(m_target.gameObject);
}
m_target = humanPoseTransfer;
await SetupTargetAsync(m_target, visible: false);
// VR用 FirstPerson 設定
var controller = instance.GetComponent<VRM10Controller>();
var created = await controller.Vrm.FirstPerson.SetupAsync(controller.gameObject);
//メッシュを表示します
// loaded.ShowMeshes();
foreach (var r in created)
{
// FistPerson flag = auto で生成されたモデル
r.enabled = true;
}
instance.ShowMeshes();
return instance;
}
}
@ -136,7 +144,7 @@ namespace UniVRM10.FirstPersonSample
}
m_source = context.Root.GetComponent<UniHumanoid.HumanPoseTransfer>();
var task = SetupTargetAsync(m_target, true);
SetupTarget(m_target);
}
}
}