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

由于模型不停更改,需要频繁手动添加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");
        }
    }
}

在这里插入图片描述

在这里插入图片描述

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-05-14 01:46:05       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-05-14 01:46:05       106 阅读
  3. 在Django里面运行非项目文件

    2024-05-14 01:46:05       87 阅读
  4. Python语言-面向对象

    2024-05-14 01:46:05       96 阅读

热门阅读

  1. 代码随想录训练营32day-动态规划5

    2024-05-14 01:46:05       34 阅读
  2. QT--4

    QT--4

    2024-05-14 01:46:05      36 阅读
  3. 接码平台实用

    2024-05-14 01:46:05       39 阅读
  4. REACT选择状态结构

    2024-05-14 01:46:05       35 阅读
  5. 学习websocket

    2024-05-14 01:46:05       41 阅读
  6. self.predictor.setup_model(model=self.model, verbose=is_cli)

    2024-05-14 01:46:05       32 阅读
  7. SpringSecurity多表,多端账户登录

    2024-05-14 01:46:05       34 阅读
  8. Python 自动化脚本系列:第1集

    2024-05-14 01:46:05       31 阅读
  9. 基于大数据的医疗信息化系统

    2024-05-14 01:46:05       32 阅读
  10. C#正则表达式,提取信息使用

    2024-05-14 01:46:05       32 阅读
  11. 大数据ETL工具kettle-spoon

    2024-05-14 01:46:05       42 阅读
  12. redis试题按知识点归类(三)

    2024-05-14 01:46:05       29 阅读