Skip to content

Commit 05e9730

Browse files
authored
Create AudioClipPlayerWindow.cs
1 parent a38620c commit 05e9730

File tree

1 file changed

+128
-0
lines changed

1 file changed

+128
-0
lines changed

AudioClipPlayerWindow.cs

Lines changed: 128 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,128 @@
1+
#if UNITY_EDITOR
2+
using UnityEditor;
3+
using UnityEngine;
4+
using System.Collections.Generic;
5+
6+
namespace RimuruDev.Editor
7+
{
8+
[HelpURL("https://github.com/RimuruDev/Unity.AudioClipPlayer")]
9+
public sealed class AudioClipPlayerWindow : EditorWindow
10+
{
11+
private const string FindFilter = "t:AudioClip";
12+
13+
// ReSharper disable once FieldCanBeMadeReadOnly.Local
14+
// NOTE: Don't add readonly!!!
15+
private List<AudioClip> audioClips = new();
16+
17+
private bool loopAudio;
18+
private Vector2 scrollPos;
19+
private AudioSource audioSource;
20+
21+
[MenuItem("RimuruDev Tools/Audio Clip Player")]
22+
public static void ShowWindow() =>
23+
GetWindow(typeof(AudioClipPlayerWindow), false, "Audio Clip Player");
24+
25+
private void OnGUI()
26+
{
27+
GUILayout.Label("Audio Clip Player", EditorStyles.boldLabel);
28+
29+
if (GUILayout.Button("Select Folder and Load Audio Clips"))
30+
LoadAudioClipsFromFolder();
31+
32+
if (audioClips.Count > 0)
33+
{
34+
loopAudio = EditorGUILayout.Toggle("Loop", loopAudio);
35+
36+
scrollPos = EditorGUILayout.BeginScrollView(scrollPos);
37+
38+
for (var i = 0; i < audioClips.Count; i++)
39+
{
40+
EditorGUILayout.BeginHorizontal();
41+
42+
audioClips[i] = (AudioClip)EditorGUILayout.ObjectField(audioClips[i], typeof(AudioClip), false);
43+
44+
if (GUILayout.Button("Play", GUILayout.Width(50)))
45+
PlayClip(audioClips[i]);
46+
47+
if (GUILayout.Button("Remove", GUILayout.Width(70)))
48+
{
49+
audioClips.RemoveAt(i);
50+
break;
51+
}
52+
53+
EditorGUILayout.EndHorizontal();
54+
}
55+
56+
EditorGUILayout.EndScrollView();
57+
58+
if (GUILayout.Button("Clear All"))
59+
{
60+
audioClips.Clear();
61+
StopClip();
62+
}
63+
64+
if (GUILayout.Button("Stop All"))
65+
{
66+
StopClip();
67+
}
68+
}
69+
else
70+
{
71+
GUILayout.Label("No Audio Clips added", EditorStyles.helpBox);
72+
}
73+
}
74+
75+
private void LoadAudioClipsFromFolder()
76+
{
77+
var folderPath = EditorUtility.OpenFolderPanel("Select Folder with Audio Clips", "Assets", "");
78+
var relativePath = "Assets" + folderPath.Replace(Application.dataPath, "").Replace("\\", "/");
79+
80+
if (!string.IsNullOrEmpty(folderPath))
81+
{
82+
var guids = AssetDatabase.FindAssets(FindFilter, new[] { relativePath });
83+
84+
audioClips.Clear();
85+
foreach (string guid in guids)
86+
{
87+
var path = AssetDatabase.GUIDToAssetPath(guid);
88+
var clip = AssetDatabase.LoadAssetAtPath<AudioClip>(path);
89+
90+
if (clip != null)
91+
audioClips.Add(clip);
92+
}
93+
94+
if (audioClips.Count == 0)
95+
{
96+
Debug.LogWarning("No audio clips found in the selected folder.");
97+
}
98+
}
99+
}
100+
101+
private void PlayClip(AudioClip clip)
102+
{
103+
if (audioSource == null)
104+
{
105+
GameObject audioSourceGameObject = new GameObject("EditorAudioSource");
106+
audioSource = audioSourceGameObject.AddComponent<AudioSource>();
107+
audioSource.hideFlags = HideFlags.HideAndDontSave;
108+
}
109+
110+
audioSource.clip = clip;
111+
audioSource.loop = loopAudio;
112+
audioSource.Play();
113+
}
114+
115+
private void StopClip()
116+
{
117+
if (audioSource != null && audioSource.isPlaying)
118+
audioSource.Stop();
119+
}
120+
121+
private void OnDisable()
122+
{
123+
if (audioSource != null)
124+
DestroyImmediate(audioSource.gameObject);
125+
}
126+
}
127+
}
128+
#endif

0 commit comments

Comments
 (0)