首页 > 其他分享 >Unity 编辑器资源导入处理函数 OnPostprocessAudio :深入解析与实用案例

Unity 编辑器资源导入处理函数 OnPostprocessAudio :深入解析与实用案例

时间:2023-08-08 22:01:34浏览次数:44  
标签:sampleSettings 音频 Unity 导入 设置 audioImporter OnPostprocessAudio 处理函数

Unity 编辑器资源导入处理函数 OnPostprocessAudio 用法

https://github.com/AlianBlank/download.unity.com

点击封面跳转下载页面

简介

在Unity中,我们可以使用编辑器资源导入处理函数(OnPostprocessAudio)来自定义处理音频资源的导入过程。这个函数是继承自AssetPostprocessor类的,通过重写这个函数,我们可以在音频资源导入完成后执行一些自定义的操作。

继承 AssetPostprocessor

首先,我们需要创建一个继承自AssetPostprocessor的脚本。这个脚本将用于处理音频资源的导入过程。以下是一个示例代码:

using UnityEditor;
using UnityEngine;

public class AudioPostprocessor : AssetPostprocessor
{
    void OnPostprocessAudio(AudioClip clip)
    {
        // 在这里编写自定义的音频导入处理逻辑
    }
}

在这个示例中,我们创建了一个名为AudioPostprocessor的脚本,并重写了OnPostprocessAudio函数。

自定义音频导入处理逻辑

OnPostprocessAudio函数中,我们可以编写自定义的音频导入处理逻辑。以下是一个示例代码,展示了如何在导入音频资源后修改其属性:

using UnityEditor;
using UnityEngine;

public class AudioPostprocessor : AssetPostprocessor
{
    void OnPostprocessAudio(AudioClip clip)
    {
        // 将音频的音量设置为0.5
        AudioImporter audioImporter = (AudioImporter)assetImporter;
        AudioImporterSampleSettings sampleSettings = audioImporter.defaultSampleSettings;
        sampleSettings.volume = 0.5f;
        audioImporter.defaultSampleSettings = sampleSettings;
    }
}

在这个示例中,我们获取了音频导入器(AudioImporter)并修改了其默认的采样设置(defaultSampleSettings)。我们将音频的音量设置为0.5,这样在导入后播放该音频时,其音量将会减小一半。

你可以根据自己的需求编写任何自定义的音频导入处理逻辑。例如,你可以修改音频的压缩设置、设置循环属性、添加标签等等。

使用 OnPostprocessAudio 函数

要使用OnPostprocessAudio函数,只需将继承自AssetPostprocessor的脚本放置在项目中的任何位置即可。当你导入音频资源时,Unity将自动调用OnPostprocessAudio函数,并执行你编写的自定义逻辑。

请注意,OnPostprocessAudio函数只会在导入音频资源时被调用,而不会在资源更新或删除时被调用。

示例代码

using UnityEditor;
using UnityEngine;

public class MyAudioPostprocessor : AssetPostprocessor
{
    void OnPostprocessAudio(AudioClip audioClip)
    {
        // 获取导入的音频资源
        AudioImporter audioImporter = assetImporter as AudioImporter;

        // 根据不同平台设置音频的压缩格式
        SetCompressionFormat(audioImporter);

        // 根据不同平台设置音频的加载方式
        SetLoadType(audioImporter);

        // 调整音频的音量
        AdjustVolume(audioClip);

        // 设置资源打包标签
        SetAssetBundleTag(audioImporter);

        // 根据不同平台设置音频的采样率
        SetSampleRate(audioImporter);
    }

    // 根据不同平台设置音频的压缩格式
    private void SetCompressionFormat(AudioImporter audioImporter)
    {
        AudioImporterSampleSettings sampleSettings = audioImporter.defaultSampleSettings;

        // Android 平台使用 OGG 压缩格式
        if (EditorUserBuildSettings.activeBuildTarget == BuildTarget.Android)
        {
            sampleSettings.compressionFormat = AudioCompressionFormat.Vorbis;
        }
        // iOS 平台使用 AAC 压缩格式
        else if (EditorUserBuildSettings.activeBuildTarget == BuildTarget.iOS)
        {
            sampleSettings.compressionFormat = AudioCompressionFormat.AAC;
        }
        // 其他平台使用 MP3 压缩格式
        else
        {
            sampleSettings.compressionFormat = AudioCompressionFormat.MP3;
        }

        audioImporter.defaultSampleSettings = sampleSettings;
    }

    // 根据不同平台设置音频的加载方式
    private void SetLoadType(AudioImporter audioImporter)
    {
        AudioImporterLoadType loadType = AudioImporterLoadType.CompressedInMemory;

        // Android 平台使用解压缩加载方式
        if (EditorUserBuildSettings.activeBuildTarget == BuildTarget.Android)
        {
            loadType = AudioImporterLoadType.StreamFromDisc;
        }

        audioImporter.loadType = loadType;
    }

    // 调整音频的音量
    private void AdjustVolume(AudioClip audioClip)
    {
        float[] audioData = new float[audioClip.samples * audioClip.channels];
        audioClip.GetData(audioData, 0);
        for (int i = 0; i < audioData.Length; i++)
        {
            audioData[i] *= 0.5f; // 调整音量为原来的一半
        }
        audioClip.SetData(audioData, 0);
    }

    // 设置资源打包标签
    private void SetAssetBundleTag(AudioImporter audioImporter)
    {
        audioImporter.assetBundleName = "AudioBundle";
        audioImporter.assetBundleVariant = "unity3d";
    }

    // 根据不同平台设置音频的采样率
    private void SetSampleRate(AudioImporter audioImporter)
    {
        AudioImporterSampleSettings sampleSettings = audioImporter.defaultSampleSettings;

        // Android 平台设置采样率为 44100
        if (EditorUserBuildSettings.activeBuildTarget == BuildTarget.Android)
        {
            sampleSettings.sampleRateSetting = AudioSampleRateSetting.OverrideSampleRate;
            sampleSettings.sampleRateOverride = 44100;
        }
        // iOS 平台设置采样率为 48000
        else if (EditorUserBuildSettings.activeBuildTarget == BuildTarget.iOS)
        {
            sampleSettings.sampleRateSetting = AudioSampleRateSetting.OverrideSampleRate;
            sampleSettings.sampleRateOverride = 48000;
        }
        // 其他平台使用默认采样率
        else
        {
            sampleSettings.sampleRateSetting = AudioSampleRateSetting.PreserveSampleRate;
        }

        audioImporter.defaultSampleSettings = sampleSettings;
    }
}

在上述代码中,我们根据不同的平台设置了不同的导入设置,以确保音频资源在不同平台上的最佳效果和性能。我们根据音频长度获取合适的加载方式、合理的码率和合理的采样率,并将这些设置应用到音频导入器的默认采样设置中。

请注意,示例代码中的判断逻辑是简单的示例,您可以根据实际需求进行修改和扩展。

通过以上示例代码,您可以根据自己的需求对音频资源进行自定义处理,以达到更好的导入效果和使用体验。

总结

通过使用Unity的编辑器资源导入处理函数OnPostprocessAudio,我们可以在音频资源导入完成后执行自定义的处理逻辑。这使得我们能够根据项目需求修改音频资源的属性和设置,从而更好地控制和管理音频资源。


我的技术文章中可能存在的错误向您表示诚挚的歉意。我努力确保提供准确可靠的信息,但由于技术领域的不断变化,错误难以避免。如果您发现了错误或有任何疑问,请与我联系。我将竭尽全力纠正错误并提供更准确的信息。

再次向您表示最诚挚的歉意,我将更加谨慎地审查和更新文章,以提供更好的阅读体验和准确的技术信息。

谢谢您的理解和支持。

标签:sampleSettings,音频,Unity,导入,设置,audioImporter,OnPostprocessAudio,处理函数
From: https://blog.51cto.com/u_7509448/7012697

相关文章

  • Unity 编辑器资源导入处理函数 OnPostprocessAudio :深入解析与实用案例
    Unity编辑器资源导入处理函数OnPostprocessAudio用法点击封面跳转下载页面简介在Unity中,我们可以使用编辑器资源导入处理函数(OnPostprocessAudio)来自定义处理音频资源的导入过程。这个函数是继承自AssetPostprocessor类的,通过重写这个函数,我们可以在音频资源导入完成后执......
  • Unity的UnityStats: 属性详解与实用案例
    UnityStats属性详解UnityStats是Unity引擎提供的一个用于监测游戏性能的工具,它提供了一系列的属性值,可以帮助开发者解游戏的运行情况,从而进行优化。本文将详细介绍UnityStats的每个属性值,并提供多个使用例子帮助开发者更好地使用UnityStats。帧率相关属性UnityStats.fps......
  • Unity 实现转换bmp为png
    .netframework的Bitmap类返回的pixel中alpha的值恒为255,因此需要自己读取对应的类。BMP格式https://en.wikipedia.org/wiki/BMP_file_format#Pixel_storage参考https://blog.csdn.net/sgs691459/article/details/111387043实现结果privatevoidConvertBmp2Png(stringp......
  • 如何用 Unity 做出一只赛博宠物(0代码新手向)
    推荐的一些学习资料unity官方文档:Unity用户手册(2019.4LTS)-Unity手册视频教程:https://www.bilibili.com/video/BV1zB4y1C7U9live2d官方文档:https://docs.live2d.com/zh-CHS/cubism-sdk-tutorials/top/https://docs.live2d.com/zh-CHS/cubism-sdk-manual/cubism-sdk-......
  • warning: /var/cache/yum/x86_64/7/mysql57-community/packages/mysql-community-comm
    问题描述在我正确地安装好mysql包之后,再安装mysql,就出现了这么一个问题:就去疯狂百度找解决问题的方法!!!问题解决经过查找资料,才发现,原来是有GPG验证检查,只需要禁止GPG验证检查就行啦!也就是在安装mysql的语句后面,加上这样一个语句:--nogpgcheck总起来就是:yum-yinstallmys......
  • 安装unity2022后启动工程提示“Unity is running as administrator.”
    问题背景:如题,最近项目更新到unity2022.3.6f1版本,在部分机器发现会不停提示“Unityisrunningasadministrator.”解决方案:同网上大多数方案雷同,采用调整uac安全级别来避免。1.搜索栏直接搜控制面板,或者win+r键入control,打开控制面板界面;2.选中“系统和安全”后,点击“更改用......
  • Unity三维数学总结
    三维向量和三角函数 三维向量向量是指一个同时具有大小和方向,且满足平行四边形法则的几何对象。向量的模po点相对于世界坐标原点的距离:po.magnitude。标准向量,归一向量,指的是将向量的模变成1,方向不变。改变后的向量:po.normalized。向量的方向求向量的方向(求向量模......
  • 四、Unity中颜色空间
    Unity中的设置通过点击菜单Edit->ProjectSettings->Player页签->OtherSettings下的Rendering部分进行修改,参数ColorSpace可以选择Gamma或Linear。当选择GammaSpace时,Unity不会做任何处理。当选择LinearSpace时,引擎的渲染流程在线性空间计算,理想情况下项目使用线性空间的贴图颜......
  • Unity用CPU上下翻转Texture2D的最优解
    将Texture2D上下翻转效率的进化史以下数据都是基于8000x4000全景图进行对比的1、最简单也是最先想到的,直接根据索引塞到另一个数组里,耗时:0.3061805秒staticColor32[]FlipColors(Color32[]originalColors,intwidth,intheight){Color32[]......
  • Unity的IUnityLinkerProcessor:深入解析与实用案例
    UnityIUnityLinkerProcessorUnityIUnityLinkerProcessor是Unity引擎中的一个接口,它允许开发者在Unity项目构建时对代码进行链接处理。这个接口可以用来优化项目构建大小,减少不必要的代码和资源,提高项目的性能和加载速度。接口定义IUnityLinkerProcessor接口定义如下:namespac......