トーフメモ

主にゲーム制作

【Unity】エディタ拡張で音楽をながす方法 

f:id:tofgame:20190428235503j:plain
EditorWindowを作成してその中で音を出したい!
コンポーネントを作るんじゃなく、直接呼び出したい!
調べました!

AudioUtility

既につよいスクリプトを作っている人がいたので、これを利用して実装します。
このAudioUtility内のメソッドを使ってAulidclipを呼び出します。
https://forum.unity.com/threads/reflected-audioutil-class-for-making-audio-based-editor-extensions.308133/

このAudioUtilityの中でも、PlayClipというメソッドをピックアップして何をしているのかを見てみます。

PlayClip()

using System;
using System.Reflection;
using UnityEngine;

namespace UnityEditor {
    public static class AudioUtility {
        public static void PlayClip(AudioClip clip , int startSample , bool loop) {
            Assembly unityEditorAssembly = typeof(AudioImporter).Assembly;
            Type audioUtilClass = unityEditorAssembly.GetType("UnityEditor.AudioUtil");
            MethodInfo method = audioUtilClass.GetMethod(
                "PlayClip",
                BindingFlags.Static | BindingFlags.Public,
                null,
                new System.Type[] {
                typeof(AudioClip),
                typeof(Int32),
                typeof(Boolean)
                },
                null
            );

            method.Invoke(
                null,
                new object[] {
                clip,
                startSample,
                loop
                }
            );
        }
    }
}

ここでは、AudioUtilクラスをリフレクションしています。
PlayClipメソッドを呼び出して音を鳴らします。
リフレクションについては、以下のページも是非みてください!
tofgame.hatenablog.com

実際に音楽をかける

新しいウィンドウを開いた時にメソッドを呼び出すようにエディタ拡張をします。

using UnityEditor;
using UnityEngine;

public class EditorWindow : EditorWindow {
    private static AudioClip audioClip;

    [MenuItem("music/tst")]
    public static void Open () {
        var window = CreateInstance<EditorWindow>();
        window.Show();

        audioClip = Resources.Load<AudioClip>("bgm1");
        AudioUtility.PlayClip(audioClip,0,true); //ここで呼び出し!!
    }

    private void OnDisable () {
        AudioUtility.StopClip(audioClip);
    }
}

複数ウィンドウを作るとその分だけ音楽がながれます。

youtu.be

おわりに

作業中に音楽をならすミュージックプレイヤーウィンドウとかも作れそうですね!