Unity使用编辑器代码给模型添加uLipSync组件

8 篇文章 0 订阅

由于模型不停更改,需要频繁手动添加uLipSync组件,花时间写了编辑器代码去处理

using uLipSync;
using UnityEditor;
using UnityEditor.Events;
using UnityEngine;
using static uLipSync.uLipSyncBlendShape;

/// <summary>
/// 模型添加uLipSync组件
/// </summary>
public class AdduLipSyncComponent : EditorWindow
{
    private GameObject selectedObject;
    private AudioSource audioSource;
    private SkinnedMeshRenderer skinnedMeshRenderer;
    /// <summary>
    /// 男的
    /// </summary>
    private bool isMale = false;

    [MenuItem("Tools/模型添加uLipSync组件")]
    public static void ShowWindow()
    {
        GetWindow<AdduLipSyncComponent>("模型添加uLipSync组件");
    }

    private void OnGUI()
    {
        GUILayout.Label("选择模型:", EditorStyles.boldLabel);
        selectedObject = EditorGUILayout.ObjectField(selectedObject, typeof(GameObject), true) as GameObject;
        EditorGUILayout.Space();

        GUILayout.Label("选择音源:", EditorStyles.boldLabel);
        audioSource = EditorGUILayout.ObjectField(audioSource, typeof(AudioSource), true) as AudioSource;
        EditorGUILayout.Space();

        GUILayout.Label("选择口形动画SkinnedMeshRenderer:", EditorStyles.boldLabel);
        skinnedMeshRenderer = EditorGUILayout.ObjectField(skinnedMeshRenderer, typeof(SkinnedMeshRenderer), true) as SkinnedMeshRenderer;
        EditorGUILayout.Space();

        isMale = EditorGUILayout.Toggle("男的", isMale);
        EditorGUILayout.Space();

        if (GUILayout.Button("添加组件") && selectedObject != null && audioSource != null && skinnedMeshRenderer != null)
        {
            AddComponent();
        }

        EditorGUILayout.Space();
        if (GUILayout.Button("运行"))
        {
            EditorApplication.isPlaying = true;
        }
    }

    void AddComponent()
    {
        //给音频组件添加uLipSyncAudioSource
        uLipSyncAudioSource uLipSyncAudioSource = audioSource.gameObject.GetComponent<uLipSyncAudioSource>();
        if (uLipSyncAudioSource != null)
        {
            DestroyImmediate(uLipSyncAudioSource);
        }
        uLipSyncAudioSource = audioSource.gameObject.AddComponent<uLipSyncAudioSource>();
        uLipSyncBlendShape uLipSyncBlendShape = selectedObject.GetComponent<uLipSyncBlendShape>();
        if (uLipSyncBlendShape != null)
        {
            DestroyImmediate(uLipSyncBlendShape);
        }
        uLipSyncBlendShape = selectedObject.AddComponent<uLipSyncBlendShape>();
        uLipSyncBlendShape.skinnedMeshRenderer = skinnedMeshRenderer;
        uLipSyncBlendShape.minVolume = -3f;
        uLipSyncBlendShape.maxVolume = -2f;
        uLipSyncBlendShape.smoothness = 0.05f;

        #region AIUEON-
        BlendShapeInfo A = new BlendShapeInfo();
        A.phoneme = "A";
        A.maxWeight = 1f;
        A.index = 1;
        uLipSyncBlendShape.blendShapes.Add(A);

        BlendShapeInfo I = new BlendShapeInfo();
        I.phoneme = "I";
        I.maxWeight = 1f;
        I.index = 3;
        uLipSyncBlendShape.blendShapes.Add(I);

        BlendShapeInfo U = new BlendShapeInfo();
        U.phoneme = "U";
        U.maxWeight = 1f;
        U.index = 5;
        uLipSyncBlendShape.blendShapes.Add(U);

        BlendShapeInfo E = new BlendShapeInfo();
        E.phoneme = "E";
        E.maxWeight = 1f;
        E.index = 2;
        uLipSyncBlendShape.blendShapes.Add(E);

        BlendShapeInfo O = new BlendShapeInfo();
        O.phoneme = "O";
        O.maxWeight = 1f;
        O.index = 4;
        uLipSyncBlendShape.blendShapes.Add(O);

        BlendShapeInfo N = new BlendShapeInfo();
        N.phoneme = "N";
        N.maxWeight = 1f;
        uLipSyncBlendShape.blendShapes.Add(N);

        BlendShapeInfo ms = new BlendShapeInfo();
        ms.phoneme = "-";
        ms.maxWeight = 1f;
        uLipSyncBlendShape.blendShapes.Add(ms);
        #endregion

        uLipSync.uLipSync uls = selectedObject.GetComponent<uLipSync.uLipSync>();
        if (uls != null)
        {
            DestroyImmediate(uls);
        }
        uls = selectedObject.AddComponent<uLipSync.uLipSync>();
        uls.outputSoundGain = 1f;
        uls.audioSourceProxy = uLipSyncAudioSource;
#if UNITY_WEBGL
        uls.autoAudioSyncOnWebGL = true;
        uls.audioSyncOffsetTime = 0f;
#endif
        UnityEventTools.AddPersistentListener(uls.onLipSyncUpdate, uLipSyncBlendShape.OnLipSyncUpdate);

        if (isMale)
        {
            uls.profile = AssetDatabase.LoadAssetAtPath<Profile>("Assets/uLipSync/Assets/Profiles/uLipSync-Profile-Sample-Male.asset");
        }
        else
        {
            uls.profile = AssetDatabase.LoadAssetAtPath<Profile>("Assets/uLipSync/Assets/Profiles/uLipSync-Profile-Sample-Female.asset");
        }
    }
}

在这里插入图片描述

在这里插入图片描述

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

地狱为王

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值