Unityエディターのリソースインポート処理機能OnPreprocessAudio:徹底した分析と実践事例

Unityエディタのリソースインポート処理関数OnPreprocessAudioの使用方法

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

表紙をクリックするとダウンロードページに飛びます

導入

Unity では、リソースのインポートはプロジェクト内のリソースの使用と効果を決定する非常に重要なリンクです。Unity は、一連のリソース インポート処理関数を提供します。その関数の 1 つが ですOnPreprocessAudioこの機能では、インポート設定の変更、オーディオ ファイルのプロパティの変更など、リソースのインポート プロセス中にオーディオ リソースをカスタマイズできます。この記事では、OnPreprocessAudio開発者がこの機能をよりよく理解して使用できるように、関数の使用方法とサンプルコードを紹介します。

関数シグネチャ

void OnPreprocessAudio()

機能説明

OnPreprocessAudioリソースのインポート中に呼び出されるコールバック関数です。OnPreprocessAudioUnity がオーディオ リソースをインポートするとき、スクリプトに関数がある場合、Unity はインポート プロセス中にこの関数を呼び出し、開発者はこの関数でオーディオ リソースをカスタマイズできます。

説明書

この機能を使用するにはOnPreprocessAudio、次の手順に従う必要があります。

  1. 関数をAssetPostprocessor継承して実装するスクリプト クラスを作成します。OnPreprocessAudio
using UnityEditor;
using UnityEngine;

public class MyAudioPostprocessor : AssetPostprocessor
{
    void OnPreprocessAudio()
    {
        // 在这里编写自定义处理逻辑
    }
}
  1. スクリプト クラスをプロジェクトのEditorフォルダーに配置して、エディター モードでのみ実行されるようにします。

  2. OnPreprocessAudioカスタム処理ロジックを関数に記述します必要に応じて、オーディオ リソースのインポート設定を変更したり、オーディオ ファイルのプロパティを変更したりできます。

void OnPreprocessAudio()
{
    // 获取导入的音频资源
    AudioImporter audioImporter = assetImporter as AudioImporter;

    // 修改导入设置
    audioImporter.loadInBackground = true;
    audioImporter.preloadAudioData = true;

    // 修改音频文件的属性
    AudioImporterSampleSettings sampleSettings = audioImporter.defaultSampleSettings;
    sampleSettings.loadType = AudioClipLoadType.Streaming;
    audioImporter.defaultSampleSettings = sampleSettings;
}

上記のサンプル コードでは、オーディオ リソースのインポート設定を変更して、バックグラウンドで読み込み、オーディオ データをプリロードするようにしています。同時に、オーディオ ファイルのプロパティも変更し、読み込みタイプをストリーミングに設定しました。

  1. スクリプトを保存し、Unity エディターに戻ります。オーディオ アセットをインポートすると、Unity は自動的にOnPreprocessAudio関数を呼び出し、カスタム処理ロジックを実行します。もちろん、さまざまなプラットフォームに応じて、さまざまなサンプリング レート、音声の長さの読み込み方法、圧縮形式、音声品質の設定など、記事を完全に書き直すお手伝いをいたします。書き直された記事の全文は次のとおりです。

サンプルコード

using UnityEditor;
using UnityEngine;

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

        // 根据平台进行不同设置
        #if UNITY_ANDROID
            SetAndroidSettings(audioImporter);
        #elif UNITY_IOS
            SetiOSSettings(audioImporter);
        #else
            SetDefaultSettings(audioImporter);
        #endif
    }

    // Android 平台设置
    private void SetAndroidSettings(AudioImporter audioImporter)
    {
        AudioImporterSampleSettings sampleSettings = audioImporter.defaultSampleSettings;
        sampleSettings.loadType = GetAndroidLoadType(); // 根据音频长度获取合适的加载方式
        sampleSettings.compressionFormat = AudioCompressionFormat.Vorbis;
        sampleSettings.quality = GetAndroidQuality(); // 根据音频长度获取合理的码率
        sampleSettings.sampleRateSetting = AudioSampleRateSetting.OverrideSampleRate;
        sampleSettings.sampleRateOverride = (uint) GetAndroidSampleRate(); // 根据音频长度获取合理的采样率
        audioImporter.defaultSampleSettings = sampleSettings;
    }

    // iOS 平台设置
    private void SetiOSSettings(AudioImporter audioImporter)
    {
        AudioImporterSampleSettings sampleSettings = audioImporter.defaultSampleSettings;
        sampleSettings.loadType = GetiOSLoadType(); // 根据音频长度获取合适的加载方式
        sampleSettings.compressionFormat = AudioCompressionFormat.AAC;
        sampleSettings.quality = GetiOSQuality(); // 根据音频长度获取合理的码率
        sampleSettings.sampleRateSetting = AudioSampleRateSetting.OverrideSampleRate;
        sampleSettings.sampleRateOverride = (uint) GetiOSSampleRate(); // 根据音频长度获取合理的采样率
        audioImporter.defaultSampleSettings = sampleSettings;
    }

    // 默认设置
    private void SetDefaultSettings(AudioImporter audioImporter)
    {
        AudioImporterSampleSettings sampleSettings = audioImporter.defaultSampleSettings;
        sampleSettings.loadType = GetDefaultLoadType(); // 根据音频长度获取合适的加载方式
        sampleSettings.compressionFormat = AudioCompressionFormat.MP3;
        sampleSettings.quality = GetDefaultQuality(); // 根据音频长度获取合理的码率
        sampleSettings.sampleRateSetting = AudioSampleRateSetting.OverrideSampleRate;
        sampleSettings.sampleRateOverride = (uint) GetDefaultSampleRate(); // 根据音频长度获取合理的采样率
        audioImporter.defaultSampleSettings = sampleSettings;
    }

    // 根据音频长度获取 Android 平台的合适加载方式
    private AudioClipLoadType GetAndroidLoadType()
    {
        // 在这里编写根据音频长度获取合适加载方式的逻辑
        // 示例代码:
        float audioLength = GetAudioLength(); // 获取音频长度
        if (audioLength > 10f)
        {
            return AudioClipLoadType.Streaming;
        }
        else
        {
            return AudioClipLoadType.DecompressOnLoad;
        }
    }

    // 根据音频长度获取 iOS 平台的合适加载方式
    private AudioClipLoadType GetiOSLoadType()
    {
        // 在这里编写根据音频长度获取合适加载方式的逻辑
        // 示例代码:
        float audioLength = GetAudioLength(); // 获取音频长度
        if (audioLength > 10f)
        {
            return AudioClipLoadType.Streaming;
        }
        else
        {
            return AudioClipLoadType.DecompressOnLoad;
        }
    }

    // 根据音频长度获取默认平台的合适加载方式
    private AudioClipLoadType GetDefaultLoadType()
    {
        // 在这里编写根据音频长度获取合适加载方式的逻辑
        // 示例代码:
        float audioLength = GetAudioLength(); // 获取音频长度
        if (audioLength > 10f)
        {
            return AudioClipLoadType.Streaming;
        }
        else
        {
            return AudioClipLoadType.DecompressOnLoad;
        }
    }

    // 根据音频长度获取 Android 平台的合理码率
    private float GetAndroidQuality()
    {
        // 在这里编写根据音频长度获取合理码率的逻辑
        // 示例代码:
        float audioLength = GetAudioLength(); // 获取音频长度
        if (audioLength < 30f)
        {
            return 0.3f;
        }
        else
        {
            return 0.2f;
        }
    }

    // 根据音频长度获取 iOS 平台的合理码率
    private float GetiOSQuality()
    {
        // 在这里编写根据音频长度获取合理码率的逻辑
        // 示例代码:
        float audioLength = GetAudioLength(); // 获取音频长度
        if (audioLength < 30f)
        {
            return 0.5f;
        }
        else
        {
            return 0.4f;
        }
    }

    // 根据音频长度获取默认平台的合理码率
    private float GetDefaultQuality()
    {
        // 在这里编写根据音频长度获取合理码率的逻辑
        // 示例代码:
        float audioLength = GetAudioLength(); // 获取音频长度
        if (audioLength < 30f)
        {
            return 0.6f;
        }
        else
        {
            return 0.5f;
        }
    }

    // 根据音频长度获取 Android 平台的合理采样率
    private int GetAndroidSampleRate()
    {
        // 在这里编写根据音频长度获取合理采样率的逻辑
        // 示例代码:
        float audioLength = GetAudioLength(); // 获取音频长度
        if (audioLength < 30f)
        {
            return 44100;
        }
        else
        {
            return 22050;
        }
    }

    // 根据音频长度获取 iOS 平台的合理采样率
    private int GetiOSSampleRate()
    {
        // 在这里编写根据音频长度获取合理采样率的逻辑
        // 示例代码:
        float audioLength = GetAudioLength(); // 获取音频长度
        if (audioLength < 30f)
        {
            return 48000;
        }
        else
        {
            return 24000;
        }
    }

    // 根据音频长度获取默认平台的合理采样率
    private int GetDefaultSampleRate()
    {
        // 在这里编写根据音频长度获取合理采样率的逻辑
        // 示例代码:
        float audioLength = GetAudioLength(); // 获取音频长度
        if (audioLength < 30f)
        {
            return 44100;
        }
        else
        {
            return 22050;
        }
    }

    // 获取音频长度
    private float GetAudioLength()
    {
        // 在这里编写获取音频长度的逻辑
        // 示例代码:
        return 60f; // 假设音频长度为 60 秒
    }
}

上記のコードでは、さまざまなプラットフォームでオーディオ リソースの最高の効果とパフォーマンスを確保するために、さまざまなプラットフォームに応じてさまざまなインポート設定を設定しています。オーディオの長さに応じて、適切な読み込み方法、適切なビット レート、および適切なサンプリング レートを取得し、これらの設定をオーディオ インポーターのデフォルトのサンプリング設定に適用します。

サンプルコードの判定ロジックは簡単な例であり、実際のニーズに応じて変更、拡張することができます。

上記のサンプル コードを通じて、独自のニーズに応じてオーディオ リソースをカスタマイズし、インポート効果とユーザー エクスペリエンスを向上させることができます。

要約する

OnPreprocessAudioこの機能はUnityが提供するリソースインポート処理機能であり、オーディオリソースのインポート処理時にカスタマイズすることができます。カスタム ロジックを記述することで、開発者はプロジェクトのニーズに合わせてインポート設定を変更したり、オーディオ ファイルのプロパティを変更したりすることができます。OnPreprocessAudioこの記事がこの機能の理解と使用に役立つことを願っています。


私の技術記事に誤りがある可能性があることを心よりお詫び申し上げます。情報が正確で信頼できるものであることを保証するための努力が払われていますが、技術情勢は常に変化しているため、間違いは避けられません。バグを見つけた場合やご質問がある場合は、私までご連絡ください。間違いを修正し、より正確な情報を提供できるよう最善を尽くします。

改めて心よりお詫び申し上げます。より良い読書体験と正確な技術情報を提供するために、より慎重に記事を見直し、更新していきます。

ご理解とご支援をよろしくお願いいたします。

おすすめ

転載: blog.csdn.net/alianhome/article/details/132156896