AddRenderer in SetupRendererAsync

This commit is contained in:
ousttrue 2021-09-28 16:58:14 +09:00
parent 03bb4201bf
commit 50ffa89156
4 changed files with 29 additions and 38 deletions

View File

@ -110,25 +110,25 @@ namespace UniGLTF
foreach (var renderer in go.GetComponentsInChildren<Renderer>())
{
loaded._renderers.Add(renderer);
switch (renderer)
{
case MeshRenderer meshRenderer:
loaded._meshRenderers.Add(meshRenderer);
break;
case SkinnedMeshRenderer skinnedMeshRenderer:
loaded._skinnedMeshRenderers.Add(skinnedMeshRenderer);
break;
}
loaded.AddRenderer(renderer);
}
return loaded;
}
public void AddRenderers(IEnumerable<Renderer> renderers)
public void AddRenderer(Renderer renderer)
{
_renderers.AddRange(renderers);
_renderers.Add(renderer);
switch (renderer)
{
case MeshRenderer meshRenderer:
_meshRenderers.Add(meshRenderer);
break;
case SkinnedMeshRenderer skinnedMeshRenderer:
_skinnedMeshRenderers.Add(skinnedMeshRenderer);
break;
}
}
public void ShowMeshes()

View File

@ -49,20 +49,22 @@ namespace UniVRM10
var go = new GameObject("_headless_" + renderer.name);
var erased = go.AddComponent<SkinnedMeshRenderer>();
erased.enabled = false; // hide
erased.sharedMesh = mesh;
erased.sharedMaterials = renderer.sharedMaterials;
erased.bones = renderer.bones;
erased.rootBone = renderer.rootBone;
erased.updateWhenOffscreen = true;
return erased;
}
bool m_done;
async Task<SkinnedMeshRenderer> SetupRendererAsync(GameObject go, Transform FirstPersonBone, RendererFirstPersonFlags x,
async Task SetupRendererAsync(GameObject go, Transform FirstPersonBone, RendererFirstPersonFlags x,
(int FirstPersonOnly, int ThirdPersonOnly) layer, IAwaitCaller awaitCaller = null)
{
var runtime = go.GetComponent<UniGLTF.RuntimeGltfInstance>();
switch (x.FirstPersonFlag)
{
case UniGLTF.Extensions.VRMC_vrm.FirstPersonType.auto:
@ -77,10 +79,12 @@ namespace UniVRM10
// 頭を取り除いた複製モデルを作成し、1人称用にする
var headless = await CreateHeadlessMeshAsync(smr, eraseBones, awaitCaller);
headless.enabled = false;
headless.gameObject.layer = layer.FirstPersonOnly;
headless.transform.SetParent(smr.transform, false);
return headless;
if (runtime != null)
{
runtime.AddRenderer(headless);
}
}
else
{
@ -120,8 +124,6 @@ namespace UniVRM10
// 特に何もしない。すべてのカメラで描画される
break;
}
return null;
}
/// <summary>
@ -137,7 +139,7 @@ namespace UniVRM10
/// <param name="thirdPersonOnlyLayer"></param>
/// <param name="awaitCaller"></param>
/// <returns></returns>
public async Task<List<SkinnedMeshRenderer>> SetupAsync(GameObject go, int? firstPersonOnlyLayer = default, int? thirdPersonOnlyLayer = default, IAwaitCaller awaitCaller = default)
public async Task SetupAsync(GameObject go, int? firstPersonOnlyLayer = default, int? thirdPersonOnlyLayer = default, IAwaitCaller awaitCaller = default)
{
if (awaitCaller == null)
{
@ -148,23 +150,17 @@ namespace UniVRM10
Vrm10FirstPersonLayerSettings.GetFirstPersonOnlyLayer(firstPersonOnlyLayer),
Vrm10FirstPersonLayerSettings.GetThirdPersonOnlyLayer(thirdPersonOnlyLayer));
var created = new List<SkinnedMeshRenderer>();
if (m_done)
{
return created;
return;
}
m_done = true;
var FirstPersonBone = go.GetComponent<Animator>().GetBoneTransform(HumanBodyBones.Head);
foreach (var x in Renderers)
{
var renderer = await SetupRendererAsync(go, FirstPersonBone, x, layer, awaitCaller);
if (renderer)
{
created.Add(renderer);
}
await SetupRendererAsync(go, FirstPersonBone, x, layer, awaitCaller);
}
return created;
}
}
}

View File

@ -99,8 +99,7 @@ namespace UniVRM10.FirstPersonSample
// VR用 FirstPerson 設定
var controller = instance.GetComponent<Vrm10Instance>();
var created = await controller.Vrm.FirstPerson.SetupAsync(controller.gameObject);
instance.AddRenderers(created);
await controller.Vrm.FirstPerson.SetupAsync(controller.gameObject);
return instance;
}

View File

@ -7,8 +7,7 @@ VR向け FirstPerson 設定の初期化手順です。
1. Load する
2. Vrm10Instance を取得する
3. `controller.Vrm.FirstPerson.SetupAsync` を呼び出す
4. `controller.Vrm.FirstPerson.SetupAsync` した結果新規に作成されたモデルを `RuntimeGltfInstance` に渡す
5. ShowMeshes
4. ShowMeshes
```csharp
async Task<RuntimeGltfInstance> LoadAsync(string path)
@ -26,13 +25,10 @@ async Task<RuntimeGltfInstance> LoadAsync(string path)
// 2.
var controller = instance.GetComponent<Vrm10Instance>();
// 3.
var created = await controller.Vrm.FirstPerson.SetupAsync(controller.gameObject);
// 3. The headless model that created is added to instance
await controller.Vrm.FirstPerson.SetupAsync(controller.gameObject);
// 4.
instance.AddRenderers(created);
// 5.
// 4.
instance.ShowMeshes();
return instance;