天天看點

利用反射在Unity的EditorMode下播放音頻

using System;
using System.Reflection;
using UnityEditor;
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
			}
			);
		}

		public static void PlayClip(AudioClip clip , int startSample) {
			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)
			},
			null
			);
			method.Invoke(
				null,
				new object[] {
				clip,
				startSample
			}
			);
		}

		public static void PlayClip(AudioClip clip) {
			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)
			},
			null
			);
			method.Invoke(
				null,
				new object[] {
				clip
			}
			);
		}
		
		public static void StopClip(AudioClip clip) {
			Assembly unityEditorAssembly = typeof(AudioImporter).Assembly;
			Type audioUtilClass = unityEditorAssembly.GetType("UnityEditor.AudioUtil");
			MethodInfo method = audioUtilClass.GetMethod(
				"StopClip",
				BindingFlags.Static | BindingFlags.Public,
				null,
				new System.Type[] {
				typeof(AudioClip)
			},
			null
			);
			method.Invoke(
				null,
				new object[] {
				clip
			}
			);
		}
		
		public static void PauseClip(AudioClip clip) {
			Assembly unityEditorAssembly = typeof(AudioImporter).Assembly;
			Type audioUtilClass = unityEditorAssembly.GetType("UnityEditor.AudioUtil");
			MethodInfo method = audioUtilClass.GetMethod(
				"PauseClip",
				BindingFlags.Static | BindingFlags.Public,
				null,
				new System.Type[] {
				typeof(AudioClip)
			},
			null
			);
			method.Invoke(
				null,
				new object[] {
				clip
			}
			);
		}
		
		public static void ResumeClip(AudioClip clip) {
			Assembly unityEditorAssembly = typeof(AudioImporter).Assembly;
			Type audioUtilClass = unityEditorAssembly.GetType("UnityEditor.AudioUtil");
			MethodInfo method = audioUtilClass.GetMethod(
				"ResumeClip",
				BindingFlags.Static | BindingFlags.Public,
				null,
				new System.Type[] {
				typeof(AudioClip)
			},
			null
			);
			method.Invoke(
				null,
				new object[] {
				clip
			}
			);
		}

		public static void LoopClip(AudioClip clip , bool on) {
			Assembly unityEditorAssembly = typeof(AudioImporter).Assembly;
			Type audioUtilClass = unityEditorAssembly.GetType("UnityEditor.AudioUtil");
			MethodInfo method = audioUtilClass.GetMethod(
				"LoopClip",
				BindingFlags.Static | BindingFlags.Public,
				null,
				new System.Type[] {
				typeof(AudioClip),
				typeof(bool)
			},
			null
			);
			method.Invoke(
				null,
				new object[] {
				clip,
				on
			}
			);
		}

		public static bool IsClipPlaying(AudioClip clip) {
			Assembly unityEditorAssembly = typeof(AudioImporter).Assembly;
			Type audioUtilClass = unityEditorAssembly.GetType("UnityEditor.AudioUtil");
			MethodInfo method = audioUtilClass.GetMethod(
				"IsClipPlaying",
				BindingFlags.Static | BindingFlags.Public
				);
			
			bool playing = (bool)method.Invoke(
				null,
				new object[] {
				clip,
			}
			);
			
			return playing;
		}

		public static void StopAllClips () {
			Assembly unityEditorAssembly = typeof(AudioImporter).Assembly;
			Type audioUtilClass = unityEditorAssembly.GetType("UnityEditor.AudioUtil");
			MethodInfo method = audioUtilClass.GetMethod(
				"StopAllClips",
				BindingFlags.Static | BindingFlags.Public
				);

			method.Invoke(
				null,
				null
				);
		}
		
		public static float GetClipPosition(AudioClip clip) {
			Assembly unityEditorAssembly = typeof(AudioImporter).Assembly;
			Type audioUtilClass = unityEditorAssembly.GetType("UnityEditor.AudioUtil");
			MethodInfo method = audioUtilClass.GetMethod(
				"GetClipPosition",
				BindingFlags.Static | BindingFlags.Public
				);
			
			float position = (float)method.Invoke(
				null,
				new object[] {
				clip
			}
			);
			
			return position;
		}

		public static int GetClipSamplePosition(AudioClip clip) {
			Assembly unityEditorAssembly = typeof(AudioImporter).Assembly;
			Type audioUtilClass = unityEditorAssembly.GetType("UnityEditor.AudioUtil");
			MethodInfo method = audioUtilClass.GetMethod(
				"GetClipSamplePosition",
				BindingFlags.Static | BindingFlags.Public
				);
			
			int position = (int)method.Invoke(
				null,
				new object[] {
				clip
			}
			);
			
			return position;
		}

		public static void SetClipSamplePosition(AudioClip clip , int iSamplePosition) {
			Assembly unityEditorAssembly = typeof(AudioImporter).Assembly;
			Type audioUtilClass = unityEditorAssembly.GetType("UnityEditor.AudioUtil");
			MethodInfo method = audioUtilClass.GetMethod(
				"SetClipSamplePosition",
				BindingFlags.Static | BindingFlags.Public
				);
			
			method.Invoke(
				null,
				new object[] {
				clip,
				iSamplePosition
			}
			);
		}

		public static int GetSampleCount(AudioClip clip) {
			Assembly unityEditorAssembly = typeof(AudioImporter).Assembly;
			Type audioUtilClass = unityEditorAssembly.GetType("UnityEditor.AudioUtil");
			MethodInfo method = audioUtilClass.GetMethod(
				"GetSampleCount",
				BindingFlags.Static | BindingFlags.Public
				);
			
			int samples = (int)method.Invoke(
				null,
				new object[] {
				clip
			}
			);
			
			return samples;
		}

		public static int GetChannelCount(AudioClip clip) {
			Assembly unityEditorAssembly = typeof(AudioImporter).Assembly;
			Type audioUtilClass = unityEditorAssembly.GetType("UnityEditor.AudioUtil");
			MethodInfo method = audioUtilClass.GetMethod(
				"GetChannelCount",
				BindingFlags.Static | BindingFlags.Public
				);
			
			int channels = (int)method.Invoke(
				null,
				new object[] {
				clip
			}
			);
			
			return channels;
		}

		public static int GetBitRate(AudioClip clip) {
			Assembly unityEditorAssembly = typeof(AudioImporter).Assembly;
			Type audioUtilClass = unityEditorAssembly.GetType("UnityEditor.AudioUtil");
			MethodInfo method = audioUtilClass.GetMethod(
				"GetChannelCount",
				BindingFlags.Static | BindingFlags.Public
				);
			
			int bitRate = (int)method.Invoke(
				null,
				new object[] {
				clip
			}
			);
			
			return bitRate;
		}

		public static int GetBitsPerSample(AudioClip clip) {
			Assembly unityEditorAssembly = typeof(AudioImporter).Assembly;
			Type audioUtilClass = unityEditorAssembly.GetType("UnityEditor.AudioUtil");
			MethodInfo method = audioUtilClass.GetMethod(
				"GetBitsPerSample",
				BindingFlags.Static | BindingFlags.Public
				);
			
			int bits = (int)method.Invoke(
				null,
				new object[] {
				clip
			}
			);
			
			return bits;
		}

		public static int GetFrequency(AudioClip clip) {
			Assembly unityEditorAssembly = typeof(AudioImporter).Assembly;
			Type audioUtilClass = unityEditorAssembly.GetType("UnityEditor.AudioUtil");
			MethodInfo method = audioUtilClass.GetMethod(
				"GetFrequency",
				BindingFlags.Static | BindingFlags.Public
				);
			
			int frequency = (int)method.Invoke(
				null,
				new object[] {
				clip
			}
			);
			
			return frequency;
		}

		public static int GetSoundSize(AudioClip clip) {
			Assembly unityEditorAssembly = typeof(AudioImporter).Assembly;
			Type audioUtilClass = unityEditorAssembly.GetType("UnityEditor.AudioUtil");
			MethodInfo method = audioUtilClass.GetMethod(
				"GetSoundSize",
				BindingFlags.Static | BindingFlags.Public
				);
			
			int size = (int)method.Invoke(
				null,
				new object[] {
				clip
			}
			);
			
			return size;
		}

		public static Texture2D GetWaveForm(AudioClip clip , int channel , float width , float height) {
			Assembly unityEditorAssembly = typeof(AudioImporter).Assembly;
			Type audioUtilClass = unityEditorAssembly.GetType("UnityEditor.AudioUtil");
			MethodInfo method = audioUtilClass.GetMethod(
				"GetWaveForm",
				BindingFlags.Static | BindingFlags.Public
				);
			
			string path = AssetDatabase.GetAssetPath(clip);
			AudioImporter importer = (AudioImporter)AssetImporter.GetAtPath(path);
			
			Texture2D texture = (Texture2D)method.Invoke(
				null,
				new object[] {
				clip,
				importer,
				channel,
				width,
				height
			}
			);
			
			return texture;
		}

		public static Texture2D GetWaveFormFast(AudioClip clip , int channel , int fromSample , int toSample, float width , float height) {
			Assembly unityEditorAssembly = typeof(AudioImporter).Assembly;
			Type audioUtilClass = unityEditorAssembly.GetType("UnityEditor.AudioUtil");
			MethodInfo method = audioUtilClass.GetMethod(
				"GetWaveFormFast",
				BindingFlags.Static | BindingFlags.Public
				);
			
			Texture2D texture = (Texture2D)method.Invoke(
				null,
				new object[] {
				clip,
				channel,
				fromSample,
				toSample,
				width,
				height
			}
			);
			
			return texture;
		}

		public static void ClearWaveForm(AudioClip clip) {
			Assembly unityEditorAssembly = typeof(AudioImporter).Assembly;
			Type audioUtilClass = unityEditorAssembly.GetType("UnityEditor.AudioUtil");
			MethodInfo method = audioUtilClass.GetMethod(
				"ClearWaveForm",
				BindingFlags.Static | BindingFlags.Public
				);
			
			method.Invoke(
				null,
				new object[] {
				clip
			}
			);
		}

		public static bool HasPreview(AudioClip clip) {
			Assembly unityEditorAssembly = typeof(AudioImporter).Assembly;
			Type audioUtilClass = unityEditorAssembly.GetType("UnityEditor.AudioUtil");
			MethodInfo method = audioUtilClass.GetMethod(
				"GetSoundSize",
				BindingFlags.Static | BindingFlags.Public
				);
			
			bool hasPreview = (bool)method.Invoke(
				null,
				new object[] {
				clip
			}
			);
			
			return hasPreview;
		}

		public static bool IsCompressed(AudioClip clip) {
			Assembly unityEditorAssembly = typeof(AudioImporter).Assembly;
			Type audioUtilClass = unityEditorAssembly.GetType("UnityEditor.AudioUtil");
			MethodInfo method = audioUtilClass.GetMethod(
				"IsCompressed",
				BindingFlags.Static | BindingFlags.Public
				);
			
			bool isCompressed = (bool)method.Invoke(
				null,
				new object[] {
				clip
			}
			);
			
			return isCompressed;
		}

		public static bool IsStramed(AudioClip clip) {
			Assembly unityEditorAssembly = typeof(AudioImporter).Assembly;
			Type audioUtilClass = unityEditorAssembly.GetType("UnityEditor.AudioUtil");
			MethodInfo method = audioUtilClass.GetMethod(
				"IsStramed",
				BindingFlags.Static | BindingFlags.Public
				);
			
			bool isStreamed = (bool)method.Invoke(
				null,
				new object[] {
				clip
			}
			);
			
			return isStreamed;
		}

		public static double GetDuration(AudioClip clip) {
			Assembly unityEditorAssembly = typeof(AudioImporter).Assembly;
			Type audioUtilClass = unityEditorAssembly.GetType("UnityEditor.AudioUtil");
			MethodInfo method = audioUtilClass.GetMethod(
				"GetDuration",
				BindingFlags.Static | BindingFlags.Public
				);
			
			double duration = (double)method.Invoke(
				null,
				new object[] {
				clip
			}
			);
			
			return duration;
		}

		public static int GetFMODMemoryAllocated() {
			Assembly unityEditorAssembly = typeof(AudioImporter).Assembly;
			Type audioUtilClass = unityEditorAssembly.GetType("UnityEditor.AudioUtil");
			MethodInfo method = audioUtilClass.GetMethod(
				"GetFMODMemoryAllocated",
				BindingFlags.Static | BindingFlags.Public
				);
			
			int memoryAllocated = (int)method.Invoke(
				null,
				null
			);
			
			return memoryAllocated;
		}

		public static float GetFMODCPUUsage() {
			Assembly unityEditorAssembly = typeof(AudioImporter).Assembly;
			Type audioUtilClass = unityEditorAssembly.GetType("UnityEditor.AudioUtil");
			MethodInfo method = audioUtilClass.GetMethod(
				"GetFMODCPUUsage",
				BindingFlags.Static | BindingFlags.Public
				);
			
			float cpuUsage = (float)method.Invoke(
				null,
				null
				);
			
			return cpuUsage;
		}

		public static bool Is3D(AudioClip clip) {
			Assembly unityEditorAssembly = typeof(AudioImporter).Assembly;
			Type audioUtilClass = unityEditorAssembly.GetType("UnityEditor.AudioUtil");
			MethodInfo method = audioUtilClass.GetMethod(
				"Is3D",
				BindingFlags.Static | BindingFlags.Public
				);
			
			bool is3D = (bool)method.Invoke(
				null,
				new object[] {
				clip
			}
			);
			
			return is3D;
		}

		public static bool IsMovieAudio(AudioClip clip) {
			Assembly unityEditorAssembly = typeof(AudioImporter).Assembly;
			Type audioUtilClass = unityEditorAssembly.GetType("UnityEditor.AudioUtil");
			MethodInfo method = audioUtilClass.GetMethod(
				"IsMovieAudio",
				BindingFlags.Static | BindingFlags.Public
				);
			
			bool isMovieAudio = (bool)method.Invoke(
				null,
				new object[] {
				clip
			}
			);
			
			return isMovieAudio;
		}

		public static bool IsMOD(AudioClip clip) {
			Assembly unityEditorAssembly = typeof(AudioImporter).Assembly;
			Type audioUtilClass = unityEditorAssembly.GetType("UnityEditor.AudioUtil");
			MethodInfo method = audioUtilClass.GetMethod(
				"IsMOD",
				BindingFlags.Static | BindingFlags.Public
				);
			
			bool isMOD = (bool)method.Invoke(
				null,
				new object[] {
				clip
			}
			);
			
			return isMOD;
		}

		public static int GetMODChannelCount() {
			Assembly unityEditorAssembly = typeof(AudioImporter).Assembly;
			Type audioUtilClass = unityEditorAssembly.GetType("UnityEditor.AudioUtil");
			MethodInfo method = audioUtilClass.GetMethod(
				"GetMODChannelCount",
				BindingFlags.Static | BindingFlags.Public
				);
			
			int channels = (int)method.Invoke(
				null,
				null
			);
			
			return channels;
		}

		public static AnimationCurve GetLowpassCurve(AudioLowPassFilter lowPassFilter) {
			Assembly unityEditorAssembly = typeof(AudioImporter).Assembly;
			Type audioUtilClass = unityEditorAssembly.GetType("UnityEditor.AudioUtil");
			MethodInfo method = audioUtilClass.GetMethod(
				"GetLowpassCurve",
				BindingFlags.Static | BindingFlags.Public
				);
			
			AnimationCurve curve = (AnimationCurve)method.Invoke(
				null,
				new object[] {
				lowPassFilter
			}
			);
			
			return curve;
		}

		public static Vector3 GetListenerPos() {
			Assembly unityEditorAssembly = typeof(AudioImporter).Assembly;
			Type audioUtilClass = unityEditorAssembly.GetType("UnityEditor.AudioUtil");
			MethodInfo method = audioUtilClass.GetMethod(
				"GetListenerPos",
				BindingFlags.Static | BindingFlags.Public
				);
			
			Vector3 position = (Vector3)method.Invoke(
				null,
				null
			);
			
			return position;
		}

		public static void UpdateAudio() {
			Assembly unityEditorAssembly = typeof(AudioImporter).Assembly;
			Type audioUtilClass = unityEditorAssembly.GetType("UnityEditor.AudioUtil");
			MethodInfo method = audioUtilClass.GetMethod(
				"UpdateAudio",
				BindingFlags.Static | BindingFlags.Public
				);
			
			method.Invoke(
				null,
				null
				);
		}

		public static void SetListenerTransform(Transform t) {
			Assembly unityEditorAssembly = typeof(AudioImporter).Assembly;
			Type audioUtilClass = unityEditorAssembly.GetType("UnityEditor.AudioUtil");
			MethodInfo method = audioUtilClass.GetMethod(
				"SetListenerTransform",
				BindingFlags.Static | BindingFlags.Public
				);
			
			method.Invoke(
				null,
				new object[] {
				t
			}
			);
		}

		public static AudioType GetClipType(AudioClip clip) {
			Assembly unityEditorAssembly = typeof(AudioImporter).Assembly;
			Type audioUtilClass = unityEditorAssembly.GetType("UnityEditor.AudioUtil");
			MethodInfo method = audioUtilClass.GetMethod(
				"GetClipType",
				BindingFlags.Static | BindingFlags.Public
				);
			
			AudioType type = (AudioType)method.Invoke(
				null,
				new object[] {
				clip
			}
			);

			return type;
		}

		public static AudioType GetPlatformConversionType(AudioType inType , BuildTargetGroup targetGroup , AudioImporterFormat format) {
			Assembly unityEditorAssembly = typeof(AudioImporter).Assembly;
			Type audioUtilClass = unityEditorAssembly.GetType("UnityEditor.AudioUtil");
			MethodInfo method = audioUtilClass.GetMethod(
				"GetPlatformConversionType",
				BindingFlags.Static | BindingFlags.Public
				);
			
			AudioType type = (AudioType)method.Invoke(
				null,
				new object[] {
				inType,
				targetGroup,
				format
			}
			);
			
			return type;
		}

		public static bool HaveAudioCallback(MonoBehaviour behaviour) {
			Assembly unityEditorAssembly = typeof(AudioImporter).Assembly;
			Type audioUtilClass = unityEditorAssembly.GetType("UnityEditor.AudioUtil");
			MethodInfo method = audioUtilClass.GetMethod(
				"HaveAudioCallback",
				BindingFlags.Static | BindingFlags.Public
				);
			
			bool hasCallback = (bool)method.Invoke(
				null,
				new object[] {
				behaviour
			}
			);
			
			return hasCallback;
		}

		public static int GetCustomFilterChannelCount(MonoBehaviour behaviour) {
			Assembly unityEditorAssembly = typeof(AudioImporter).Assembly;
			Type audioUtilClass = unityEditorAssembly.GetType("UnityEditor.AudioUtil");
			MethodInfo method = audioUtilClass.GetMethod(
				"GetCustomFilterChannelCount",
				BindingFlags.Static | BindingFlags.Public
				);
			
			int channels = (int)method.Invoke(
				null,
				new object[] {
				behaviour
			}
			);
			
			return channels;
		}

		public static int GetCustomFilterProcessTime(MonoBehaviour behaviour) {
			Assembly unityEditorAssembly = typeof(AudioImporter).Assembly;
			Type audioUtilClass = unityEditorAssembly.GetType("UnityEditor.AudioUtil");
			MethodInfo method = audioUtilClass.GetMethod(
				"GetCustomFilterProcessTime",
				BindingFlags.Static | BindingFlags.Public
				);
			
			int processTime = (int)method.Invoke(
				null,
				new object[] {
				behaviour
			}
			);
			
			return processTime;
		}

		public static float GetCustomFilterMaxIn(MonoBehaviour behaviour , int channel) {
			Assembly unityEditorAssembly = typeof(AudioImporter).Assembly;
			Type audioUtilClass = unityEditorAssembly.GetType("UnityEditor.AudioUtil");
			MethodInfo method = audioUtilClass.GetMethod(
				"GetCustomFilterMaxIn",
				BindingFlags.Static | BindingFlags.Public
				);
			
			float maxIn = (float)method.Invoke(
				null,
				new object[] {
				behaviour,
				channel
			}
			);
			
			return maxIn;
		}

		public static float GetCustomFilterMaxOut(MonoBehaviour behaviour , int channel) {
			Assembly unityEditorAssembly = typeof(AudioImporter).Assembly;
			Type audioUtilClass = unityEditorAssembly.GetType("UnityEditor.AudioUtil");
			MethodInfo method = audioUtilClass.GetMethod(
				"GetCustomFilterMaxOut",
				BindingFlags.Static | BindingFlags.Public
				);
			
			float maxOut = (float)method.Invoke(
				null,
				new object[] {
				behaviour,
				channel
			}
			);
			
			return maxOut;
		}
	}
}