1.由于要制作编辑器,肯定是要绘制的,所以先引入using UnityEditor;(我们视情况而定,可能用到GUILayout和EditorGUILayout)

2.流程:(1)在扩展界面输入音频名和路径-->(2)通过一个字典进行方便的操作,并且对那些需要更改的操作存储到文本中,方便再次读取(3)-->通过音频管理器加载音频并对音频进行操作

一共需要两个脚本,一个编辑器脚本(AudioWindowsEditor),用来进行存储新的音频文件或者删除,修改,查看等功能

,一个音频管理器脚本(AudioManager),用来加载,播放,暂停音乐,两者的交互点是一个音频的可持续化文件,里面存储了路径和名称

//编辑器

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
using System.IO;
using System.Text;
using System.Text.RegularExpressions;

public class AudioWindowsEditor : EditorWindow
{
    private string m_name;
    private string m_path;
    [MenuItem("Manager/AudioManager")]
    static void CreateWindow()
    {
        //Rect rect = new Rect(400, 400, 400, 400);
        //AudioWindowsEditor window = EditorWindow.GetWindow(typeof(AudioWindowsEditor)) as AudioWindowsEditor;
        AudioWindowsEditor window = EditorWindow.GetWindow<AudioWindowsEditor>("音效管理");
        window.Show();
    }

void Awake()
    {
        pathDic = new Dictionary<string, string>();
        _LoadAudioPath();
        
    }

//绘制面板
    private Dictionary<string, string> pathDic;
    void OnGUI()
    {
        //开始水平布局
        GUILayout.BeginHorizontal();
        GUILayout.Label("音效名称");
        GUILayout.Label("音效路径");
        GUILayout.Label("操作");
        GUILayout.EndHorizontal();
        if (pathDic == null)
        {
            pathDic = new Dictionary<string, string>();
        }
        foreach (var item in pathDic)
        {
            GUILayout.BeginHorizontal();
            GUILayout.Label(item.Key);
            GUILayout.Label(item.Value);

if (GUILayout.Button("操作"))
            {
                pathDic.Remove(item.Key);
                _SaveAudioPath();
                return;
            }
            GUILayout.EndHorizontal();
        }
        //GUILayout
        m_name = EditorGUILayout.TextField("name", m_name);
        m_path = EditorGUILayout.TextField("path", m_path);
        if (GUILayout.Button("save path"))
        {
            //按照他所给的路径加载音效
            object o = Resources.Load(m_path);
            if (o == null)
            {
                Debug.LogWarning("音效不存在");
            }
            else
            {
                if (pathDic == null)
                {
                    pathDic = new Dictionary<string, string>();
                }
                if (pathDic.ContainsKey("name"))
                {
                    Debug.LogError("The pathDic have 重复 value");
                }
                else
                {
                    pathDic.Add(m_name, m_path);
                    _SaveAudioPath();
                }
            }
            //在foreach内进行删除元素操作可能会产生影响
        }

}
    //1s10次,有够多
    void OnInspectorUpdate()
    {
        _LoadAudioPath();
    }
    //对文件进行存储操作,也就是增删改查,如果只是追加的话不妥当,
    void _SaveAudioPath()
    {
        StringBuilder sb = new StringBuilder();
        foreach (var item in pathDic)
        {
            sb.Append("name:" + item.Key + ",path:" + item.Value + "\n");
        }
        File.WriteAllText(AudioManager.m_loadAudioPath, sb.ToString());
    }
    //对文件进行读取操作并加载到编辑器界面
    void _LoadAudioPath()
    {
        if (!File.Exists(AudioManager.m_loadAudioPath)) { return;  }
        else
        {
            //TODO 这里面每0.1S都要执行一次pathDic和添加操作,应该吧所有操作放在一个类中,然后再每次操作之后再加载所有资源
            if(pathDic!=null)
            pathDic.Clear();

string m_pattern = @"name:|,path:";
            //的确是可能产生这样的错误的
            //StreamReader sr = new StreamReader(m_AudioLoadPath);
            string[] lines = File.ReadAllLines(AudioManager.m_loadAudioPath);
            foreach (string item in lines)
            {
                if (item == "") break;
                string[] keyvalue = Regex.Split(item, m_pattern);
                pathDic.Add(keyvalue[1], keyvalue[2]);
            }
        }
    }
}
//音频管理器
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Text.RegularExpressions;
using UnityEngine;

public class AudioManager
{
    private static string m_resourcesPath = Application.dataPath + "\\Resources";
    private const string m_audioPathText = "\\AudioList.txt";

public static string m_loadAudioPath = m_resourcesPath + m_audioPathText;

private Dictionary<string, AudioClip> m_audioClipDic;
    public void _Init()
    {
        m_audioClipDic = new Dictionary<string, AudioClip>();
        _LoadAllAudioClip();
    }
    //将文本中的信息(名称和资源路径加载到字典中进行保存
    private void _LoadAllAudioClip()
    {
        m_audioClipDic.Clear();

TextAsset ta = Resources.Load<TextAsset>("AudioList");
        if (ta == null)
        {
            Debug.LogWarning("ta is null");
            return;
        }
        string pattern = @"name:|,path:";
        //这里采用这种方法\n将一个文本文件切割成好几部分,学习
        string[] lines = ta.text.Split('\n');

foreach (var item in lines)
        {
            if (item == "") break;
            string[] keyvalue = Regex.Split(item, pattern);
            //这一种切割方式:一共有三个字段: "","4","Audio/1",所以keyvalue[1]和[2]才是我们的目标
            m_audioClipDic.Add(keyvalue[1], Resources.Load(keyvalue[2]) as AudioClip);
        }
    }
    private bool isMute = false;
    //通过名称获取字典中的音频资源文件并进行播放
    public void _PlayAudio(string name)
    {
        if (isMute) return;
        AudioClip ac;
        m_audioClipDic.TryGetValue(name, out ac);
        if (ac != null)
        {
            AudioSource.PlayClipAtPoint(ac, Vector3.zero);
        }
    }
}

---Audio编辑器制作步骤相关推荐

  1. 如何使用CocoStudio场景编辑器制作魔卡幻想

    1 CocoStudio 场景编辑器 使用 CocoStudio 场景编辑器来创建游戏场景,其中包含游戏 UI 与动画,来定制一个游戏主界面. 2 使用 CocoStudio 完成<魔卡幻想&g ...

  2. 二、Qt定时器与文本编辑器制作《QT 入门到实战》

    学习目标 了解 qt 的 pixmap 了解 qt 的 label 如何显示图片 了解定时器的开启 了解定时器的关闭 了解文件如何进行读取 了解 QFileDialog 的使用 了解了一个文本编辑器的 ...

  3. 【cocos2d-x】如何使用CocoStudio场景编辑器制作魔卡幻想

    1 CocoStudio 场景编辑器 使用 CocoStudio 场景编辑器来创建游戏场景,其中包含游戏 UI 与动画,来定制一个游戏主界面. 2 使用 CocoStudio 完成<魔卡幻想&g ...

  4. 微电影宣传片制作步骤分享。

    微电影宣传片制作步骤分享. 在如今这个视频产业迅速发展的时期,微电影也作为其中一个重要组成部分在近几年得到了飞速的发展.现在拍摄的成本被放低,每个人几乎都拥有可以拍摄的东西.因为微电影之制作简单,拍摄 ...

  5. 360°全景图制作步骤和技巧有哪些?

    360°全景图在过去加几年一直没有好的发展,但是由于这次新冠疫情的影响,使得360°全景图再次让更多的人知道, 360°全景图可以让客户有一种身临其境的感觉,还有一定的交互性,因此要比一般的宣传媒介受 ...

  6. php下雨效果源码,ps下雨效果制作步骤

    ps下雨效果制作步骤:首先打开ps软件,并导入一张图片素材:然后新建一个透明图层,并选择填充工具,将填充图层为白色:接着点击菜单栏的滤镜选项,并在弹出的列表选择像素化:最后在点状化的设置窗口中调整参数 ...

  7. 用计算机做动画效果,动画图片多种效果制作步骤

    动画图片多种效果制作步骤:文字绕月旋转做法 <一>打开FLASH软件,设置版面及导入背景图片,按图解进行,并在35帧处插入帧 . 当这些操作完后与平时在办公软件打字一样,打一部分就保存,这 ...

  8. ​微信小程序开发难?资深大V教您微信小程序制作步骤和方法​

    ​微信小程序开发难?资深大V教您微信小程序制作步骤和方法​ 一.登录微信公众平台 就能在菜单"开发"---"基本配置"中看到小程序的AppID了,小程序的 Ap ...

  9. 【Dash搭建可视化网站】项目13:销售数据可视化大屏制作步骤详解

    销售数据可视化大屏制作步骤详解 1 项目效果图 2 项目架构 3 文件介绍和功能完善 3.1 assets文件夹介绍 3.2 app.py和index.py文件完善 3.3 header.py文件完善 ...

最新文章

  1. hdu 1254(dfs+bfs+优先队列)
  2. Redis AOF带来的问题
  3. android daemon 程序,(转)Android App Daemon
  4. 铜仁计算机专业学校,听说计算机专业的在本部啊 这是真的么
  5. sas一元回归分析_商业分析的应用
  6. 8块钱搞定一个顶级域名 (全过程) B篇
  7. 【限时免费】架构和运维技术高峰论坛 (成都站)
  8. 把GBK源码文件转UTF8的JAVA代码说明
  9. c# Quartz使用
  10. w10 桌面计算机垃圾桶,win10垃圾桶图标不见了怎么办
  11. 2007版的office软件下载及简介
  12. 【Excle】在方框内打勾
  13. ssm框架 mysql 一对多_ssm2: :sparkles: 基于SSM框架简单的文章管理系统,使用MySQL多表存储方式实现留言回复功能...
  14. 第十三弹 服务数据的定义与使用
  15. windows命令行工具
  16. Python-opencv实现Trackbar调节亮度对比度
  17. 微信‘小程序’: web前端的春天 or 噩梦?
  18. 安卓巴士总结了近百个Android优秀开源项
  19. 【下载Tomcat旧版本】
  20. Python实现数字图像处理之5种彩色空间转换(单图+多图+视频)

热门文章

  1. 多媒体基础知识思维导图
  2. 游戏工作室使用的手机多控系统
  3. 冉有-支付宝钱包的研发挑战和最佳实践
  4. Excel表格数据不能编辑?
  5. 【Linux】ubuntu或linux网卡配置/etc/network/interfaces【转】
  6. PTA(每日一题)7-16 jmu-分段函数l
  7. mediapipe——人体姿势关节点检测(pose模块) 学习笔记(全)
  8. 真实的硅谷到底什么样?这些漫画告诉你!
  9. 计算机大学生夏令营广告语,武汉大学计算机学院2016年优秀大学生暑期夏令营活动实施方案...
  10. 放蛋糕,字符串转换成整数