using System; using UnityEngine; namespace VRM { [Serializable] public struct BlendShapeBinding { public String RelativePath; public int Index; public float Weight; public override string ToString() { return string.Format("{0}[{1}]=>{2}", RelativePath, Index, Weight); } } [Serializable] public struct MaterialValueBinding { public String MaterialName; public String ValueName; public Vector4 TargetValue; public Vector4 BaseValue; } [CreateAssetMenu(menuName = "VRM/BlendShapeClip")] public class BlendShapeClip : ScriptableObject { #if UNITY_EDITOR /// /// Preview 用のObject参照 /// [SerializeField] GameObject m_prefab; public GameObject Prefab { set { m_prefab = value; } get { if (m_prefab == null) { var assetPath = UnityEditor.AssetDatabase.GetAssetPath(this); if (!string.IsNullOrEmpty(assetPath)) { // if asset is subasset of prefab m_prefab = UnityEditor.AssetDatabase.LoadAssetAtPath(assetPath); if (m_prefab == null) { var parent = UniGLTF.UnityPath.FromAsset(this).Parent; var prefabPath = parent.Parent.Child(parent.FileNameWithoutExtension + ".prefab"); m_prefab = UnityEditor.AssetDatabase.LoadAssetAtPath(prefabPath.Value); } } } return m_prefab; } } #endif /// /// BlendShapePresetがUnknown場合の識別子 /// [SerializeField] public string BlendShapeName = ""; /// /// BlendShapePresetを識別する。Unknownの場合は、BlendShapeNameで識別する /// [SerializeField] public BlendShapePreset Preset; /// /// BlendShapeに対する参照(indexベース) /// /// [SerializeField] public BlendShapeBinding[] Values = new BlendShapeBinding[] { }; /// /// マテリアルに対する参照(名前ベース) /// /// [SerializeField] public MaterialValueBinding[] MaterialValues = new MaterialValueBinding[] { }; /// /// UniVRM-0.45: trueの場合、このBlendShapeClipは0と1の間の中間値を取らない。四捨五入する /// [SerializeField] public bool IsBinary; } }