Other/Unity

[Unity] Asset 폴더(혹은 저장경로)에서 AudioClip 재생하기(Get AudioClip from Assets folder or located file path)

개발왕 금골드 2020. 5. 8. 12:30
반응형

안녕하세요 골드입니다. 

오늘은 Unity에서 AudioClip을 재생하는 여러 방법에 대해서 글을 쓰도록 하겠습니다.

 

 

1. AudioClip

 

AudioClip이란 오디오 파일을 저장하는 공간입니다.

https://docs.unity3d.com/kr/530/ScriptReference/AudioClip.html

 

Unity - 스크립팅 API: AudioClip

Success! Thank you for helping us improve the quality of Unity Documentation. Although we cannot accept all submissions, we do read each suggested change from our users and will make updates where applicable. 닫기

docs.unity3d.com

 유니티는 다양한 오디오 형식을 지원합니다. 예를 들면 OGG, MP3, WAV 등이 있습니다. 주의하실 점은 mp3파일은 phone에서만 재생 가능하다는 점입니다.  pc(window)에서 mp3파일은 사용할 수 없습니다. 이유는 저작권 때문이라고 알고 있습니다. 물론 구글에 검색하면 다양한 해결법이 존재하기 때문에 불가능은 아닙니다만, 유니티 내에서 공식적으로 지원하지 않다보니 사용법이 다소 어려울 수 있습니다.

 

2. AudioSource

 AudioSource의 Play, Pause, Stop 등을 사용해서 AudioClip을 재생할 수 있습니다. AudioSource는 3D 환경에서 소리를 재생하기 위해 GameObject에 첨부됩니다. volume 속성을 사용해서 재생 중에 볼륨을 조절하거나, time 속성을 설정해서 재생 위치를 설정할 수도 있습니다. PlayOneShot()를 사용해서 하나의 AudioSource에서 여러 소리를 재생할 수 있습니다. PlayClipAtPoint()를 사용해서 3D공간의 고정된 위치에서 AudioClip을 재생할 수도 있습니다.

https://docs.unity3d.com/kr/530/ScriptReference/AudioSource.html

 

Unity - 스크립팅 API: AudioSource

오디오 소스는 3D환경에서 소리를 재생하기 위해 GameObject에 첨부됩니다. 모노 사운드는 3D로 재생한다. 3D 사운드를 재생하기 위해서는 AudioListener가 필요합니다. 오디오 리스너(audio listener)는 주��

docs.unity3d.com

 

3. Asset 폴더 안에 있는 Audio 파일 재생하기

 먼저 Asset 폴더 안에 있는 Audio 파일을 재생하는 방법입니다. 가장 간단한 방법은 GameObject에 AudioSource 컴포넌트를 추가한 후 AudioClip을 드래그 앤 드랍 해서 재생하면 됩니다. 게임 실행 중에 동적으로 바꾸려면 코드를 추가해야 합니다. 그럼 코드로 불러오기 위해 한 가지 필요한 것이 있습니다.

 여기 Asset 폴더 밑에 Resources 폴더를 추가했습니다. 그 밑에 sample이라는 audio 파일이 있습니다.

sample 파일에 경로는 이렇습니다.

 

Assets/Resources/sample 만약 Audio 파일 안에 넣어서 더 깔끔하게 정리하고 싶다면 경로는Assets/Resources/Audio/sample 가 됩니다.

 

그럼 이제 코드를 작성해봅니다. 유니티에서 Resources 폴더는 특별합니다. class UnityEngine.Resources 가 존재하기 때문입니다. Resources 클래스는 Assets 폴더 하위에 있는 오브젝트를 찾거나 불러올때 사용합니다. Assets폴더 내 "Resources"이름을 가진 폴더안의 모든 에셋은 Resources.Load 함수를 통해서 접근할 수 있습니다. 여러개의 "Resources" 폴더가 존재할 수 있으며 오브젝트 로드시에 모두 검사 대상이 됩니다.

https://docs.unity3d.com/kr/530/ScriptReference/Resources.html

 

Unity - 스크립팅 API: Resources

에디터에서, Resources.FindObjectsOfTypeAll기능은 에셋과 씬 오브젝트를 찾는 데 사용할 수 있습니다. Assets폴더 내 "Resources"이름을 가진 폴더안의 모든 에셋은 Resources.Load 함수를 통해서 접근할 수 있습

docs.unity3d.com

 

우리가 원하는 방법이 저기 있습니다. 바로 Resources.Load() 입니다. 사용하는 방법은 이렇습니다.

위의 sample 파일을 예로 들면,

AudioSource.clip = Resoureces.Load("sample") as AudioClip

또는 AudioSource.clip = Resoureces.Load("sample" typeof(AudioClip)) as AudioClip

 

만약 Resources/Audio/sample 경로에 있다면

 

AudioSource.clip = Resoureces.Load("Audio/sample") as AudioClip

 

주의하실 점은 / 를 사용한다는 점입니다. 흔히 경로를 지정할때 쓰는 \를 사용하지 않습니다.

그리고 확장자는 작성하지 않습니다.

 

다른 예시 이미지입니다.

 

4. file path를 사용하여 Audio 파일 재생하기

 이번에는 Assets 폴더가 아닌 다른 곳에 저장되어 있는 audio 파일을 재생하는 방법입니다. 지금 소개해드리는 방법은 Unity에서 Obsolated된 방법입니다. 이거 쓰지말고 최신 버전 있으니까 그거 쓰라는 뜻입니다.

저는 일단 소개해드리고 뒤에서 다른 방법을 설명하겠습니다. 우리가 저장한 audio 파일이 있는 위치가 있습니다. 거기에 있는 파일을 가져와서 이게 audio 파일이라는 것을 알려줘야 합니다.

 

 이번에는 WWW라는 class를 사용하겠습니다. WWW클래스는 웹 페이지에 간단히 접근합니다. URL의 컨텐츠를 받아오기위한 작은 유틸리티 모듈을 나타냅니다. 새 WWW 오브젝트를 반환하는 WWW(url)를 호출해서, 백그라운드에서 다운로드를 시작할 수 있습니다.

/isDone/속성을 검사해서 다운로드가 완료 되었는지 확인할 수 있고 또는 yield 구문을 이용해서 오브젝트가 자동으로 다운로드가 완료될 때까지 대기하도록 할 수 있습니다. (게임의 나머지 부분을 멈추지 않고)

https://docs.unity3d.com/kr/530/ScriptReference/WWW.html

 

Unity - 스크립팅 API: WWW

URL의 컨텐츠를 받아오기위한 작은 유틸리티 모듈을 나타냅니다. 새 WWW 오브젝트를 반환하는 WWW(url)를 호출해서, 백그라운드에서 다운로드를 시작할 수 있습니다. /isDone/속성을 검사해서 다운로드가 완료 되었는지 확인할 수 있고 또는 yield 구문을 이용해서 오브젝트가 자동으로 다운로드가 완료될 때까지 대기하도록 할 수 있습니다. (게임의 나머지 부분을 멈추지 않고) 게임의 기능에서 웹 서버로부터 높은 점수 목록 같은 데이터를 받아와야 하는

docs.unity3d.com

우리는 WWW(url)의 url 부분에 file:// 경로를 입력할 것입니다.

예를 들면

WWW www = new WWW(file path);

혹 다운로드 폴더 안에 있다면

WWW www = new WWW(C:\Users\UserName\Downloads); 입니다.

 

www 코드를 코루틴 안에서 선언하여 완료될때까지 기다릴 수 있습니다. 만약 일반 메서드에서 선언한다면 오디오가 재생되지 않는 현상이 있을 수 있습니다.

 

예를 들면 이런 코드입니다.

 

IEnumerator TestWWW() {

   WWW www = new WWW(FILEPATH);

   yield return www; 이 코드가 완료될때까지 기다리는 코드 한 줄입니다.

}

 

설명이 너무 길었습니다. 저장된 경로에 있는 오디오 파일을 코드로 불러오는 방법은 이렇습니다.

 

IEnumerator TestWWW() {

   WWW www = new WWW(filepath);

   yield return www;

   AudioSource.clip = www.GetAudioClip();

   AudioSource.Play();

}

 

여기서 AudioSource는 여러분의 참조 코드로 바꿔야 합니다.

this.gameObject.GetComponent<AudioSource>() 혹은 GameObject.Find("Audio Something").GetComponent<AudioSource>(); 를 통해 참조할 수 있습니다.

 

예시 코드 이미지입니다.

WWW는 확장자도 같이 적어줘야 합니다.

 

 

5. UnityWebRequest 사용하기

UnityWebRequest는 WWW를 대신하기 위해 나왔습니다.

그렇기 때문에 사용법도 WWW와 유사한 점이 많습니다.

 

IEnumerator TestUnityWebRequest() {

   using(UnityWebRequest www = UnityWebRequestMultimedia.GetAudioClip(filepath, AudioType)) {

     yield return www.Send();

     if(www.isNetworkError) {

       Debug.Log(www.error);

     } else {

       AudioClip myClip = DownloadHandlerAudioClip.GetContent(www);

       AudioSource.clip = myClip;

       AudioSource.Play();

     }

   }

}

 

사용법이 아주 비슷합니다. 몇 가지 차이점이 존재하지만 제가 using 문으로 UnityWebRequest를 감싼거 말고 딱히 없습니다.

 예시 코드입니다. 사용해봤을때 url(여기서는 file path)을 작성할때 앞에 file:///를 작성하지 않으면 빌드한 후에 제대로 작동하지 않는 오류(?)가 있었습니다. WWW와 UnityWebRequest 모두 Audioclip을 가져오기 위해 사용했습니다. 단순히 Audio만 가져와서 플레이하는 간단한 코드이기 때문에 사용법도 비슷하고 코드가 조금 바뀌었을 뿐이지 한줄한줄 그 의미는 둘 다 비슷합니다.

 

 아직까지 WWW를 사용하거나 남이 사용한 코드를 많이 볼 수 있기 때문에 WWW를 소개했고 현재 UnityWebRequest를 권장하기 때문에 이것도 소개해봤습니다.

 

여기까지 골드였습니다.

감사합니다.

 

 

참고자료 : https://docs.unity3d.com/ScriptReference/Networking.UnityWebRequestMultimedia.GetAudioClip.html?_ga=2.165640575.1318416815.1589165838-653320832.1589165838

 

Unity - Scripting API: Networking.UnityWebRequestMultimedia.GetAudioClip

Success! Thank you for helping us improve the quality of Unity Documentation. Although we cannot accept all submissions, we do read each suggested change from our users and will make updates where applicable. Close

docs.unity3d.com

 

여기까지 골드였습니다.

감사합니다.

 

 

 

반응형