mirror of
https://github.com/vrm-c/UniVRM.git
synced 2026-04-23 07:28:55 -05:00
update RendererFirstPersonFlags。文字列で保持
This commit is contained in:
parent
a35db5cf36
commit
ca4bab658e
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user