update RendererFirstPersonFlags。文字列で保持

This commit is contained in:
ousttrue 2021-06-16 17:03:41 +09:00
parent a35db5cf36
commit ca4bab658e
5 changed files with 66 additions and 44 deletions

View File

@ -6,25 +6,48 @@ namespace UniVRM10
[Serializable]
public struct RendererFirstPersonFlags
{
public Renderer Renderer;
/// <summary>
/// RendererへのModelRootからの相対パス
/// </summary>
[SerializeField]
public String Renderer;
[SerializeField]
public UniGLTF.Extensions.VRMC_vrm.FirstPersonType FirstPersonFlag;
public Mesh SharedMesh
public static RendererFirstPersonFlags Create(Transform root, Renderer r, UniGLTF.Extensions.VRMC_vrm.FirstPersonType flag)
{
get
return new RendererFirstPersonFlags
{
var renderer = Renderer as SkinnedMeshRenderer;
if (renderer != null)
{
return renderer.sharedMesh;
}
Renderer = r.transform.RelativePathFrom(root),
FirstPersonFlag = flag,
};
}
var filter = Renderer.GetComponent<MeshFilter>();
if (filter != null)
{
return filter.sharedMesh;
}
public Renderer GetRenderer(Transform root)
{
var node = root.Find(Renderer);
return node?.GetComponent<Renderer>();
}
return null;
public Mesh GetSharedMesh(Transform root)
{
var renderer = GetRenderer(root);
switch (renderer)
{
case SkinnedMeshRenderer smr:
return smr.sharedMesh;
case MeshRenderer meshRenderer:
var filter = renderer.GetComponent<MeshFilter>();
if (filter != null)
{
return filter.sharedMesh;
}
return null;
default:
throw new NotImplementedException();
}
}
}

View File

@ -1,23 +1,21 @@
using System;
using System.Collections.Generic;
using UniGLTF;
using UnityEngine;
using VRMShaders;
namespace UniVRM10
{
/// <summary>
/// VRM関連の情報を集約したオブジェクト。
/// VRM関連の情報を保持するオブジェクト
/// ScriptedImporter から Extract して
/// Editor経由で Edit可能にするのが目的。
/// ヒエラルキーに対する参照を保持できないので Humanoid, Spring, Constraint は含まず
/// 下記の項目を保持することとした。
/// シーンに出さずにアセットとして編集できる。
///
/// ScriptedImporter から Extract して Edit 可能な項目なるべく増やすべく導入。
///
/// * Meta(VRM必須)
/// * Meta
/// * Expressions(enum + custom list)
/// * LookAt
/// * FirstPerson
///
/// Serialize 可能な形で保持し、Editor経由で Edit可能にするのが目的。
///
/// </summary>
public class VRM10Object : ScriptableObject
{

View File

@ -12,19 +12,19 @@ namespace UniVRM10
[SerializeField]
public List<RendererFirstPersonFlags> Renderers = new List<RendererFirstPersonFlags>();
public void CopyTo(GameObject _dst, Dictionary<Transform, Transform> map)
{
var dst = _dst.GetOrAddComponent<VRM10Controller>();
dst.Vrm.FirstPerson.Renderers = Renderers.Select(x =>
{
var renderer = map[x.Renderer.transform].GetComponent<Renderer>();
return new RendererFirstPersonFlags
{
Renderer = renderer,
FirstPersonFlag = x.FirstPersonFlag,
};
}).ToList();
}
// public void CopyTo(GameObject _dst, Dictionary<Transform, Transform> map)
// {
// var dst = _dst.GetOrAddComponent<VRM10Controller>();
// dst.Vrm.FirstPerson.Renderers = Renderers.Select(x =>
// {
// var renderer = map[x.Renderer.transform].GetComponent<Renderer>();
// return new RendererFirstPersonFlags
// {
// Renderer = renderer,
// FirstPersonFlag = x.FirstPersonFlag,
// };
// }).ToList();
// }
// If no layer names are set, use the default layer IDs.
// Otherwise use the two Unity layers called "VRMFirstPersonOnly" and "VRMThirdPersonOnly".
@ -94,7 +94,7 @@ namespace UniVRM10
{
case UniGLTF.Extensions.VRMC_vrm.FirstPersonType.auto:
{
if (x.Renderer is SkinnedMeshRenderer smr)
if (x.GetRenderer(go.transform) is SkinnedMeshRenderer smr)
{
var eraseBones = GetBonesThatHasAncestor(smr, FirstPersonBone);
if (eraseBones.Any())
@ -112,7 +112,7 @@ namespace UniVRM10
// 削除対象が含まれないので何もしない
}
}
else if (x.Renderer is MeshRenderer mr)
else if (x.GetRenderer(go.transform) is MeshRenderer mr)
{
if (mr.transform.Ancestors().Any(y => y == FirstPersonBone))
{
@ -133,12 +133,12 @@ namespace UniVRM10
case UniGLTF.Extensions.VRMC_vrm.FirstPersonType.firstPersonOnly:
// 1人称のカメラでだけ描画されるようにする
x.Renderer.gameObject.layer = FIRSTPERSON_ONLY_LAYER;
x.GetRenderer(go.transform).gameObject.layer = FIRSTPERSON_ONLY_LAYER;
break;
case UniGLTF.Extensions.VRMC_vrm.FirstPersonType.thirdPersonOnly:
// 3人称のカメラでだけ描画されるようにする
x.Renderer.gameObject.layer = THIRDPERSON_ONLY_LAYER;
x.GetRenderer(go.transform).gameObject.layer = THIRDPERSON_ONLY_LAYER;
break;
case UniGLTF.Extensions.VRMC_vrm.FirstPersonType.both:

View File

@ -458,11 +458,11 @@ namespace UniVRM10
};
}
static UniGLTF.Extensions.VRMC_vrm.MeshAnnotation ExportMeshAnnotation(RendererFirstPersonFlags flags, Func<Renderer, int> getIndex)
static UniGLTF.Extensions.VRMC_vrm.MeshAnnotation ExportMeshAnnotation(RendererFirstPersonFlags flags, Transform root, Func<Renderer, int> getIndex)
{
return new UniGLTF.Extensions.VRMC_vrm.MeshAnnotation
{
Node = getIndex(flags.Renderer),
Node = getIndex(flags.GetRenderer(root)),
Type = flags.FirstPersonFlag,
};
}
@ -485,7 +485,7 @@ namespace UniVRM10
};
foreach (var f in firstPerson.Renderers)
{
vrm.FirstPerson.MeshAnnotations.Add(ExportMeshAnnotation(f, getIndex));
vrm.FirstPerson.MeshAnnotations.Add(ExportMeshAnnotation(f, vrmController.transform, getIndex));
}
}

View File

@ -376,10 +376,11 @@ namespace UniVRM10
foreach (var x in fp.MeshAnnotations)
{
var node = Nodes[x.Node.Value];
var relative = node.RelativePathFrom(Root.transform);
vrm.FirstPerson.Renderers.Add(new RendererFirstPersonFlags
{
FirstPersonFlag = x.Type,
Renderer = node.GetComponent<Renderer>()
Renderer = relative,
});
}
}