ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Godot 15
    게임 개발 2025. 9. 6. 13:33

     

    • 배경음악, 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. 소리 볼륨 슬라이더를 움직여서 소리가 조절되는 과정은?

    '게임 개발' 카테고리의 다른 글

    Godot 16  (0) 2025.09.07
    Git 사용법  (0) 2025.09.06
    Godot 14  (0) 2025.09.04
    Godot 13  (1) 2025.08.29
    Godot 12  (2) 2025.08.28
Designed by Tistory.