효과음 만들기

# 학습 과정 소개

월드를 입체적으로 만들기 위해 [SoundComponent](/apiReference/Components/SoundComponent)와 [SoundService](/apiReference/Services/SoundService)를 활용해 음원을 재생하고, 때에 맞게 제어하는 방법을 소개합니다.

# SoundComponent

월드를 더욱 입체적으로 만들기 위해 다양한 소리가 이곳저곳에서 재생되게 만들거나, 플레이어와 특정 엔티티의 거리에 따라 다른 음량으로 들리게 만들 수 있습니다. SoundComponent를 활용하면 특정 오브젝트와 상호 작용할 때의 몰입감을 위해 다양한 소리를 삽입하고, 적절하게 재생할 수 있습니다.   
엔티티에 SoundComponent를 추가하고 소리를 재생, 정지할 수 있습니다. 음원은 Resource Storage의 Audio RUID 또는 크리에이터가 추가한 음원의 RUID를 활용합니다. 제어할 수 있는 프로퍼티에 대한 자세한 내용은 [SoundComponent](/apiReference/Components/SoundComponent) 항목을 참고합니다.

## 활용 예시

특정 오브젝트나 몬스터에 다가갈 때 새로운 소리를 재생하여 몰입감을 높여봅시다.

### SetListenerEntity 함수

나만의 특별한 연출을 하고 싶다면, SoundComponent와 `SetListenerEntity()`로 특정 엔티티와 거리에 따라 음량을 조정할 수 있습니다. 이 함수를 활용한 컴포넌트를 특정 엔티티에 붙이면, 가까워질수록 음량이 커지고, 멀어질수록 음량이 0에 가까워집니다. 음원이 들리는 지점에 진입하면 다시 소리가 들리지만, 이는 일시 정지 후 재생이 아닌 단순히 음량의 변화로 마지막으로 들은 부분과 바로 이어지지 않습니다. 또한 플레이어가 일반적인 이동이 아닌 텔레포트 등을 통해 이동하면 음량은 즉시 줄어듭니다.   


  1. 특정 오브젝트에 SoundComponent를 추가합니다.
  2. MyDesk에서 새로운 ObjectSound 스크립트 컴포넌트를 생성합니다.
  3. `OnBeginPlay()` 함수를 추가한 뒤 아래와 같은 코드를 작성하고, SoundComponent를 추가한 엔티티에 함께 추가합니다
  4.  [시작] 버튼을 누른 뒤 테스트해 봅시다. 양옆으로 이동하며 음량이 증감하는지 확인합니다.


    
    
    @Component
    script PlayerAudioController extends Component
        @ExecSpace("ClientOnly")
        method void OnBeginPlay()
        self.Entity.SoundComponent.AudioClipRUID = "12f37a0d7970482e82ceb45718f92674"
        self.Entity.SoundComponent.Loop = true
        self.Entity.SoundComponent:Play()
        wait(2)
        self.Entity.SoundComponent:SetListenerEntity(_UserService.LocalPlayer)
        end
    end
    

$$youtube /CVZ4WeZVdUI $$

### SetCameraAsListener 프로퍼티

SetCameraAsListener 프로퍼티를 활용하는 방법도 있습니다. SoundComponent 프로퍼티에서 설명했듯이 SetCameraAsListener를 활성화하면 화면 중앙과 음원 사이의 거리에 따라 소리 크기를 조절합니다. 간단하게 SetCameraAsListener 프로퍼티를 활용하는 방법을 살펴봅시다.   


  1. Preset List에서 아무 맵 오브젝트나 Scene에 배치한 뒤 SpriteRendererComponent - SpriteRUID에 아래의 RUID를 입력합니다. 
     * SpriteRUID : c5cf1b7c8d6447f7979b544e166965fc [png](167333830964936922246ca3c4abb9779d0b72e0eb37d)   

  2. 오브젝트에 SoundComponent를 추가하고 아래와 같이 설정합니다. 

[{"프로퍼티":"AudioClipRUID","값":"74222ba4b41d48dd97175fd691124a67"},{"프로퍼티":"HearingDistance","값":"10"},{"프로퍼티":"PlayOnEnable","값":"true"},{"프로퍼티":"SetCameraAsListener","값":"true"},{"프로퍼티":"Loop","값":"true"}]

  

  3.  [시작] 버튼을 누른 뒤 테스트해 봅시다. 망치질하는 오브젝트에 가까이 가면 효과음이 들리고 멀어질수록 소리가 나지 않습니다. $$youtube /sdNCAsm5Nj0 $$   
단, SetCameraAsListener 프로퍼티를 활성화했어도 SetListenerEntity 함수를 통해 따로 지정한 리스너 엔티티가 있으면 지정한 엔티티가 리스너가 된다는 점을 기억합시다.



# SoundService

크리에이터가 소리를 제어하고 싶은 곳에 `SoundService`를 사용해 필요한 함수를 호출해 사용합니다. 다양한 함수를 사용해 특정 상황에서 음원을 재생하거나 끌 수 있고, 특정 위치에서만 음원이 재생되도록 설정할 수 있습니다. 자세한 함수는 [SoundService](/apiReference?postId=316)를 참고하세요.

## 활용 예시

### UI 버튼 효과음 추가

UI 버튼이 눌릴 때마다 특정 효과음이 재생되게 만들 수 있습니다.

  1. UI 에디터에서 버튼을 배치합니다.
  2. EffectComponent란 이름의 새로운 스크립트 컴포넌트를 만들고, 버튼에 추가합니다.
  3. 이벤트 핸들러에 ButtonClickEvent를 추가해 클릭 이벤트를 감지합니다.
  4. 버튼을 누르면 재생될 음원의 AudioClipRUID와 음량을 입력합니다.


    
    
    @Component
    script ButtonClickSoundPlayer extends Component
        @EventSender("Self")
        handler HandleButtonClickEvent(ButtonClickEvent event)
        -- Parameters
        _SoundService:PlaySound("21600ec9d3a04cfeb69c6fe0c50e197c",1)
        end
    end
    

$$youtube /KA9t1pzrt7Q $$

### 스킬 이펙트와 효과음

기본 공격 스킬에 이펙트 스킬과 효과음을 추가해 역동적으로 연출할 수 있습니다.

  1. MyDesk에 새로운 SkillSound 스크립트 컴포넌트를 생성하고, DefaultPlayer에 추가합니다.
  2. 이벤트 핸들러에 KeyDownEvent를 추가하고 아래와 같이 내용을 작성합니다.


    
    
    @Component
    script ControlKeyFeedback extends Component
        @EventSender("Self")
        handler HandleKeyDownEvent(KeyDownEvent event)
        -- Parameters
        local key = event.key
        --------------------------------------------------------
        if key == KeyboardKey.LeftControl then
            _SoundService:PlaySound("02fe29e7670c447cb23c4ee4e5bf5674", 0.3)
            _EffectService:PlayEffect("01f39ee5971246ed8306bc471d44a1fd", self.Entity, self.Entity.TransformComponent.Position, 0, Vector3(1,1,1), false)
        end
        end
    end
    

$$youtube /TAfkne24qvw $$