[Unity Course 2] 05. 총 발사 로직 6
위키북스 출판사 이재현 저자님의 '절대강좌! 유니티' 책을 참고하여 필기한 내용입니다.
오디오
AudioListener, AudioSource 컴포넌트
AudioListener : 소리를 듣는 역할
AudioSource : 소리를 발생시키는 역할
Listener 는 씬에서 하나만 존재해야됨, Source는 여러개 존재해도 됨
오디오 파일 임포트 및 설정

Force To Mono 를 체크하면 용량이 줄어든 모습을 볼 수 있다.
음향효과에 극대화 된 게임이 아니라면 활성화 하는 것이 성능 면에서 유리함


오디오 임포트 옵션 - Load Type

| Load Type 옵션 | 설명 |
| Decompress On Load | 실행과 동시에 압축을 해제 큰 사이즈 오디오는 오버헤드 발생 작은 사이즈의 오디오에 적합 압축이 미리 해제된 상태에서 저장되기 때문 많은 메모리 사용하지만 CPU 덜소모 |
| Compressed In Memory | 메모리에 압축된 상태로 저장 실행 시 압축을 해제 약간의 오버헤드 발생 큰 오디오에 적합 |
| Streaming | Persistent 메모리(HDD, Flash Driver) 에 저장된 오디오를 스트리밍 방식으로 재생 오디오 파일을 저장하기 위한 메모리 필요 X |
오디오 임포트 옵션 - Compression Format

| 오디오 압축 포맷 | 설명 |
| PCM | 품질이 높은 대신 파일의 크기는 상대적으로 크기 때문에 짧은 오디오에 적합(비압축 포맷) |
| ADPCM | 압축비가 PCM 대비 3.5배라 파일의 크기 작음, CPU 더 사용 노이즈가 포함되어 있어서 총소리, 발걸음 같은 잡음이 포함된 오디오에 사용 |
| Vorbis / MP3 | 중간 길이 정도의 효과음 또는 배경음악에 적합 PCM 대비 품질이 떨어지나 압축률을 조절 가능 보통 압축률을 70% 정도로 설정 하는 것이 좋음 |
음악은 파일이 크기 때문에 미리 압축을 풀어서 보관하면 가용 메모리가 줄어듬
** 그래서 큰 파일의 오디오는 다음과 같은 임포트 설정을 권장
| Load Type | Compression Format | Quality |
| Streaming | Vorbis | |
| Compressed In Memory | Vorbis | 70% |
오디오 발생 빈도나 오디오 파일의 크기에 따라 다음과 같은 임포트 설정 권장
| 발생 빈도 | 파일의 크기 | Load Type | Compression Format |
| 빈번히 발생 | 작은 크기 | Decompress On Load | PCM 또는 ADPCM |
| 빈번히 발생 | 중간 크기 | Compressed In Memory | ADPCM |
| 가끔 발생 | 작은 크기 | Compressed In Memory | ADPCM |
| 가끔 발생 | 중간 크기 | Compressed In Memory | Vorbis |
Preload Audio Data 속성은 씬이 로딩될 때 씬에서 사용하는 모든 오디오 클립이 미리 로딩됨
언체크하면 처음 재생할 때 로딩되기 때문에 약간의 레이턴시가 발생
총소리 구현
총소리는 자주 발생하는 음원이기 때문에 아래와 같이 설정

Bullet 프리팹에 AudioSource 컴포넌트를 생성하고 P_m 4_1 오디오 파일을 삽입한다. 나머지 속성은 아래와 같이 설정해준다.

Min, Max Distance 의 속성은 아래와 같이 파란색 구체로 표현되며 소리를 들을 수 있는 범위를 나타낸다.

Min 과 Max 사이에 있을 때는 Volume Rolloff 옵션에 따라 볼륨이 서서히 감소한다.
아래는 세가지 옵션의 프리셋이다.



게임을 실행해보면 벽이나 드럼통 가까이에서 발사하면 충돌되자마자 삭제되므로 전부 재생되기 이전에 사운드가 끊어지는 현상이 발생한다. 따라서 총소리 생성은 스크립트에서 처리한다.
Bullet 프리팹의 Audio Source 컴포넌트를 삭제한다.
총소리 오디오를 발생시키는 로직
using UnityEngine;
[RequireComponent(typeof(AudioSource))]
public class FireCtrl : MonoBehaviour
{
// 총알 프리팹
public GameObject bullet;
// 총알 발사 좌표
public Transform firePos;
// 총소리에 사용할 오디오 음원
public AudioClip fireSfx;
// AudioSource 컴포넌트를 저장할 변수
private new AudioSource audio;
private void Start()
{
audio = GetComponent<AudioSource>();
}
private void Update()
{
// 마우스 왼쪽 버튼을 클릭했을 때 Fire함수 호출
if (Input.GetMouseButtonDown(0)){
Fire();
}
}
void Fire()
{
// Bullet 프리팹을 동적으로 생성(생성할 객체, 위치, 회전)
Instantiate(bullet, firePos.position, firePos.rotation);
// 총소리 발생
audio.PlayOneShot(fireSfx, 1.0f);
}
}
반드시 함께 있어야만 하는 컴포넌트를 자동으로 추가하고, 실수로 의존성이 있는 컴포넌트를 삭제하는 것을 방지
[RequireComponent(typeof(AudioSource))]
총소리를 발생시키는 로직은 Fire 함수에서 처리
AudioCource.PlayOneShot(오디오 클립, 볼륨)
