mirror of
https://github.com/vrm-c/UniVRM.git
synced 2026-04-24 06:57:49 -05:00
AddRenderer in SetupRendererAsync
This commit is contained in:
parent
03bb4201bf
commit
50ffa89156
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user