-
- 배경음악, UI 사운드 → AudioStreamPlayer
- 게임 월드 안에서 나는 소리 → AudioStreamPlayer2D
2D는 거리에 따른 소리변화를 줄 수 있다.

오디오스트림플레이어에는 기본적으로 pitch_scale속성이 있는데 min_pitch, max_pitch정해서 랜덤으로 뽑아주면 사운드를 랜덤으로 해서 안질리게 만들 수 있다.

이런식으로 버튼눌렸을 때 스크립트로 전달해서 재생시킬 수 있고

애니메이션을 쓰고있다면 애니메이션에 메소드호출 트랙으로 재생시킬 수도 있다.

뮤직 플레이어 설정화면이다.
- Inherit (상속)
- 부모 노드의 Process Mode 설정을 그대로 따라갑니다.
- 씬 트리에서 상위 노드가 Pausable이면 이 노드도 Pausable이 되는 식.
- Pausable (일시정지됨)
- 기본 모드.
- 게임이 SceneTree.paused = true로 일시정지되면 _process, _physics_process, 오디오 업데이트 같은 게 멈춥니다.
- 보통 플레이어, 적 AI 같은 “게임 로직” 노드들이 이 모드예요.
- When Paused (일시정지 시에만 동작)
- 반대 모드.
- 평소에는 동작 안 하고, 게임이 일시정지 되었을 때만 _process 등이 실행됩니다.
- 일시정지 메뉴 UI 같은 데서 쓰기 좋아요.
- Always (항상)
- 게임이 일시정지되어도 계속 동작합니다.
- 예: BGM 플레이어, UI 애니메이션, 네트워크 연결 유지 같은 것.
- Disabled (비활성화)
- 아예 _process / _physics_process 호출이 발생하지 않습니다.
- 완전히 꺼버린 상태.


메인메뉴를 메인씬으로 바꾸고 get_tree().change_scene_to_file(main.tscn)으로 하면 메인메뉴로 시작 후 play버튼을 누르면 게임을 시작시킬 수 있다.
get_tree().quit()으로 게임을 종료할 수 있다.


- value_changed: 볼륨 조절, 진행바 등 값 변화에 반응할 때 (더 일반적)
- changed: 슬라이더 설정이 전반적으로 바뀔 때 감지하고 싶을 때

\ main_menu의 스크립트
플레이 버튼을 누르면 이 신을 게임화면 장면으로 전환한다.
옵션 버튼을 누르면
option 장면을 자식으로 인스턴스화하고 option에서 back버튼을 누르면 신호를 받아서 함수로 넘겨준다 이 때 매개변수로 옵션 장면인스턴스를 같이 넘겨준다. 그 함수에서 옵션장면을 삭제한다.
bind는 이렇게 시그널에 connect해서 함수로 매개변수를 전달해야 할 때 사용한다. 직접 넣으면 오류가 난다고 함.
만약 signal 자체에 매개변수가 있다고 해보자.
# 시그널 정의시 매개변수 포함
signal my_signal(data)
# 시그널 발생시
my_signal.emit(some_data)
# 연결시 - 매개변수가 자동으로 전달됨
my_signal.connect(my_function) # my_function(data)가 호출됨이 때는 알아서 매개변수가 자동으로 전달된다. 지금은 옵션장면에서 시그널을 보낼 때의 매개변수가 아닌 메인메뉴에서의 매개변수이므로 bind로 넣은 것

다음은 옵션 메뉴의 스크립트다

창모드버튼을 클릭했을 때 현재 창모드를 가져와서 창모드면 전체모드로 바꾸고 전체모드면 창모드로 바꿈 그리고 다음 함수를 호출함

전체모드면 버튼의 text를 fullscreen으로 반대면 windowed로 한다
밑의 효과음 음악은 ready 메소드에도 이게 쓰이기 때문에 추가로 넣어놓은 것 뿐

레디 메소드의 일부분이다.
기본적으로 슬라이더의 value_chaned 시그널은 value: float을 매개변수로 전달하기 때문에 sfx라는 string만 따로 더 전달해준다.

먼저 get_bus_volume_percent(bus_name: String) 함수
가져온 bus_name으로 bus_index를 찾아온다. 인덱스로 관리하기 때문이다.
그 인덱스로 볼륨 데시벨을 오디오서버로부터 받아온다.
그 볼륨데시벨을 0.0 ~ 1.0의 숫자로 내뱉는다 (설정을 편하게 할 수 있도록)
그럼 이제 위의

이거는 ready 시점에서 bus_name으로 0~1의 값을 가져와서 슬라이더의 벨류로 넣어주는 것이다.

다음은 set_bus_volume_percent(bus_name: String, percent: float) 함수
이함수는 슬라이더의 값이 변화할 때 호출된다.
아까 처럼 오디오서버는 인덱스로 버스를 관리하기 때문에 버스이름으로 인덱스를 가져오고,
0~1사이의 슬라이더값 퍼센트를 데시벨로 바꾼 후 set_bus_volume_db메소드로 데시벨을 조절한다.
우리가 여기서 사용한 메소드들은 get_bus_index(버스이름), get_bus_volume_db(버스인덱스), set_bus_volume_db(버스인덱스와 볼륨데시벨)이다.
오늘의 질문
1. 오디오 스트림 플레이어와 오디오 스트림 플레이어 2d의 차이는?
2. 사운드를 재생할 때 마다 pitch를 조금씩 바꿔서 사운드를 풍부하게 만드는 방법은?
3. 버튼을 눌렀을 때 소리를 재생하는 play_random()을 호출하는 2가지 방법은?
4. 배경음악이 paused되어서 게임이 중단되었을 때도 재생하게 만드는 방법은?
5. bind()란?
6. 버튼으로 전체모드와 창모드를 오갈 수 있게 하는 방법은?
7. bus이름을 받아서 슬라이더에 현재 사운드 데시벨을 시각적으로 표시하는 방법은?
8. 소리 볼륨 슬라이더를 움직여서 소리가 조절되는 과정은?