게임에 음악을 추가하려면 AudioSource필요하다.

MainCamera에는 AudioListener가 기본적으로 추가되어있고 설정할 것은 없는데 카메라가 여러대일경우 하나만 남겨놓고 지워야 한다.

Resouces/Sounds폴더에서 WeaponSFX 패키지를 임포트하고 프로젝트뷰의 06.Sounds 폴더로 드래그&드롭해 위치를 옮긴다. 이패키지는 Rifle과 Shotgun 두 가지의 총소리와 폭발음이 포함돼 있다. Rifle폴더에 있는 p_m4_1사운드파일을 사용한다. 임포트한 오디오 클립은 Force To Mono옵션으 체크해서 가볍게 하고 사이즈도 줄일수 있다.

 

오디오 임포트 옵션 - Load Type

Decompress On Load : 로드시 압축을 해제하므로 사이즈가 큰 파일은 오버헤드를 발생시킨다. 작은 사이즈의 오디오에 적합하고 압축후에는 CPU자원을 덜 소비한다.

Compressed in Memory : 압축된 상태로 메모리에 상주한다. 큰 사이즈의 오디오에 적합하다.

Streaming : HDD에서 부터 스트리밍 하듯이 재생한다. 메모리가 필요없다.

 

오디오 임포트 옵션 - Compression Format

PCM : 비압축

ADPCM : 압축율 3.5배로 노이즈가 포함돼어 있는 음원에 적합

Voris / MP3 : 70%정도의 압축률

 

총소리 구현

 p_mp_1.wav을 선택해 인스펙터에서 다음과 같이 설정한다. 총소리는 발사할 때마다 총소리를 발생시키므로 Decompress On Load로 Compression Format은 ADPCM정도로 한다.

Bullet프리팹을 선택해 AudioSoruce컴포넌트를 추가한다. 속성은

Audio Clip : p_mp_1.wav , 발생시킬 음원 파일

Play On Awake : 체크, 해당 컴포넌트가 활성화될 때 자동 재생 여부

Min Distance : 5 , 볼륨 100% 값으로 음원이 들리는 영역범위

Max Distance : 10 , 음원이 들리는 최대범위

하이라키의 Bullet을 수정했기 때문에 Override>Apply All버튼을 클릭해 원본 Bullet프리팹에 저장한다. 다른 방법은 Audio Source 컴포넌트에서 우클릭후 팝업된 메뉴에서 Added Component>Apply to Prefab "Bullet"을 선택한는 것이다.

 

이렇게 Bullet Prefab에서 구현한 총소리는 충돌하자 마자 삭제되므로 사운드가 끊어지는 현상이 발생한다. 따라서 스크립트로 처리해 보겠다. Bullet Prefab에서 AudioSource 컴포넌트를 제거한다.

하이라키뷰의 Player를 선택하고 AudioSource컴포넌트를 추가한다. 수정할 필요는 없다. 다음과 같이 스크립트를 추가하고 스크립트에 오디오클립을 연결해준다.

FireCtrl 스크립 코드

using System.Collections;
using System.Collections.Generic;
using Unity.VisualScripting;
using UnityEngine;
[RequireComponent(typeof (AudioSource))]  //삭제되는것을 방지하는 어트리뷰트
public class FireCtrl : MonoBehaviour
{
    public GameObject bullet;  //총알프리팹
    public Transform firePos;  // 총알 발사 좌표
    public AudioClip fireStx;  //총소리에 사용할 음원
    private new AudioSource audio;  //오디오 소스 컴포넌트를 저장할 변수
    // Update is called once per frame
    private void Start() {
        audio = GetComponent<AudioSource>();
    }
    void Update()
    {  //마우스 왼쪽 버튼을 클릭했을때  Fire 함수 호출
        if(Input.GetMouseButtonDown(0)) {
            fire();
        }
    }
    void fire() {
        Instantiate(bullet,firePos.position, firePos.rotation); //Bullet프리팹을 동적으로 발생
        audio.PlayOneShot(fireStx, 1.0f);  //총소리발생
    }
}

 

+ Recent posts