본문 바로가기

Unity3D/C#

유니티 효과음 한 번 재생하기 (AudioSource.PlayOneShot)

반응형

PlayOneShot 호출 흐름. 할당 확인, 음량 배율 제한, 재생 요청 순서의 설명 도식입니다. 실제 Unity 화면이나 청취 결과가 아닙니다.

 

게임에서 아이템을 얻거나 버튼을 누를 때 짧은 효과음을 한 번 재생하는 경우가 있습니다. 효과음마다 재생용 오브젝트를 새로 만들기보다는, 소리를 내는 AudioSource와 사용할 AudioClip을 정해 두고 필요한 순간에 함수를 호출하는 구성이 간단합니다. Unity의 AudioSource.PlayOneShot은 전달받은 AudioClip을 재생하며 두 번째 인수로 음량의 배율을 받습니다. 여기서 한 번이라는 말은 호출을 한 번 했을 때의 재생을 뜻합니다. 이전 소리가 끝날 때까지 다음 호출을 막아 준다는 뜻은 아닙니다. PlayOneShot은 이미 재생 중인 소리를 취소하지 않으므로 빠르게 여러 번 부르면 소리가 겹칠 수 있습니다. 이번 예시에서는 짧은 효과음 하나를 인스펙터에 할당하고 공개 함수에서 재생하겠습니다. 입력 방식에 종속되지 않도록 키보드나 마우스를 읽는 코드는 넣지 않습니다.

 

C# (UNITY 3D)

 

Play_Effect를 호출하면 지정한 효과음을 재생하는 예제입니다. 소리는 정지 그림으로 확인할 수 없으므로 결과 GIF 대신 재생 함수와 할당 값을 설명합니다.

 

빈 GameObject에 AudioSource와 OneShotSound.cs를 붙입니다. Source Audio에는 그 AudioSource를, Clip Effect에는 사용 허가가 있는 짧은 AudioClip을 넣습니다. AudioSource의 Play On Awake는 끄고, UI 효과음처럼 거리와 관계없는 소리를 원하면 Spatial Blend를 0으로 설정합니다. 씬에는 소리를 듣는 AudioListener도 필요합니다.

 

플레이 모드에서 스크립트 컴포넌트의 컨텍스트 메뉴에 있는 Play Effect를 선택해 함수를 호출하는 구성입니다. using UnityEngine;으로 AudioSource, AudioClip, ContextMenu를 사용합니다. 재생을 시작하는 함수는 공개되어 있으므로 게임의 이벤트에서도 Play_Effect를 호출할 수 있습니다.

 

using UnityEngine;

//CodeFinder 코드파인더
//From https://codefinder.janndk.com/
public class OneShotSound : MonoBehaviour
{
    public AudioSource source_audio;
    public AudioClip clip_effect;
    public float volume_scale = 0.7f;

    [ContextMenu("Play Effect")]
    public void Play_Effect()
    {
        if (source_audio == null || clip_effect == null)
            return;

        // 이 예제에서는 음량 배율을 0~1 범위로 제한합니다.
        float scale = volume_scale;
        if (scale < 0f)
            scale = 0f;
        if (scale > 1f)
            scale = 1f;

        source_audio.PlayOneShot(clip_effect, scale);
    }
}

 

변수(variable)

source_audio(AudioSource) : 효과음을 재생할 소스입니다.

clip_effect(AudioClip) : 이번 호출에 사용할 소리 파일입니다.

volume_scale(float) : AudioSource 음량에 곱할 배율입니다.

 

함수(function)

Play_Effect : 할당을 확인하고 음량 배율을 제한한 뒤 PlayOneShot을 호출합니다.

 

volume_scale이 0.7이라고 최종 출력 음량을 0.7로 고정하는 것은 아닙니다. 소스의 음량에 곱하는 값입니다. API는 1보다 큰 배율도 받을 수 있지만 클리핑이 생길 수 있어 예제에서는 1까지만 전달합니다. 필드에 큰 수를 넣어도 실제 호출에 쓰는 지역 변수 scale은 1로 제한됩니다.

 

주의

 

Play_Effect를 연속으로 호출하면 앞 소리가 끝나기 전에 다음 소리가 시작될 수 있습니다. 이 코드는 재생 대기열이나 연속 입력 제한을 만들지 않습니다. 소리가 작을 때는 호출 배율뿐 아니라 AudioSource의 Volume과 Mute도 살펴봅니다. Clip Effect나 Source Audio가 비어 있으면 함수가 바로 끝나도록 했으며, 성공했다는 메시지는 출력하지 않습니다.

 

참고: AudioSource.PlayOneShot · AudioSource · ContextMenu

반응형

Google Play 및 Google Play 로고는 Google LLC의 상표입니다.