using MeshUtility; using UnityEngine; namespace UniVRM10 { [CreateAssetMenu(menuName = "VRM10/Expression")] public sealed class VRM10Expression : 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) return m_prefab; var parent = UnityPath.FromUnityPath(assetPath).Parent; var prefabPath = parent.Parent.Child(parent.FileNameWithoutExtension + ".prefab"); m_prefab = UnityEditor.AssetDatabase.LoadAssetAtPath(prefabPath.Value); if (m_prefab != null) return m_prefab; var parentParent = UnityPath.FromUnityPath(assetPath).Parent.Parent; var vrmPath = parent.Parent.Child(parent.FileNameWithoutExtension + ".vrm"); m_prefab = UnityEditor.AssetDatabase.LoadAssetAtPath(vrmPath.Value); if (m_prefab != null) return m_prefab; } } return m_prefab; } } #endif /// /// ExpressionPreset が Unknown 場合の識別子 /// [SerializeField] public string ExpressionName; /// /// ExpressionPreset を識別する。 Unknown の場合は、 ExpressionName で識別する /// [SerializeField] public UniGLTF.Extensions.VRMC_vrm.ExpressionPreset Preset; /// /// 対象メッシュの Expression を操作する /// [SerializeField] public MorphTargetBinding[] MorphTargetBindings = new MorphTargetBinding[] { }; /// /// 対象マテリアルの Color を操作する /// [SerializeField] public MaterialColorBinding[] MaterialColorBindings = new MaterialColorBinding[] { }; /// /// 対象マテリアルの UVScale+Offset を操作する /// [SerializeField] public MaterialUVBinding[] MaterialUVBindings = new MaterialUVBinding[] { }; /// /// UniVRM-0.45: trueの場合、この Expression は0と1の間の中間値を取らない。四捨五入する /// [SerializeField] public bool IsBinary; /// /// この Expression と Blink(Blink, BlinkLeft, BlinkRight) が同時に有効な場合、Blink の Weight を 0 にする /// [SerializeField] public UniGLTF.Extensions.VRMC_vrm.ExpressionOverrideType OverrideBlink; /// /// この Expression と LookAt(LookUp, LookDown, LookLeft, LookRight) が同時に有効な場合、LookAt の Weight を 0 にする /// [SerializeField] public UniGLTF.Extensions.VRMC_vrm.ExpressionOverrideType OverrideLookAt; /// /// この Expression と Mouth(Aa, Ih, Ou, Ee, Oh) が同時に有効な場合、Mouth の Weight を 0 にする /// [SerializeField] public UniGLTF.Extensions.VRMC_vrm.ExpressionOverrideType OverrideMouth; void Reset() { OnValidate(); } void OnValidate() { if (Preset == UniGLTF.Extensions.VRMC_vrm.ExpressionPreset.custom) { if (string.IsNullOrEmpty(ExpressionName)) { ExpressionName = "custom"; } } } } }