본문 바로가기

Unity3D/Audio Effects

Unity 3D Sound Effects

유니티 3D 에서 사운드 효과 예제 (포탄 발사음, 포탄 명중시 폭발음 효과)


앞서 작성했던 프로젝트 중에서 포탄을 발사하여 장벽에 명중하면 장벽이 무너졌던 프로젝트에 사운드 효과를 추가하려고 한다

사운드를 포함한 게임 오브젝트의 스크립트에서 다음과 같은 내용을 입력하면 사운드 효과를 낼 수 있다

audio.PlayOneShot(audioClip);

PlayOneShot() 함수의 아규먼트로 오디오 클립을 전달하는 점이 특이하다. 즉, audio 객체에 사운드가 포함된 것이 아니라는 점에 주의한다

스크립트에서 audio 객체는 Audio Source 콤포넌트이며 Audio Source 콤포넌트 안에 있는 Audio Clip 이 사용되는 것이 아니라, Audio Source 외부에 선언된 Audio Clip 을 Play 하는 방법을 사용한다


오브젝트에 포함된 스크립트에서 audio.xxxxx() 와 같이 audio 객체를 사용하려면 해당 오브젝트에 Audio Source 콤포넌트를 추가해 주어야 한다.

즉, 스크립트에서 사용하는 audio 객체 변수는 Audio Source 콤포넌트를 의미한다

audio.Play() 는 Audio Source 콤포넌트의 AudioClip을 Play 하는 것이고, audio.PlayOneShot(audioClip) 은 Audio Source 콤포넌트 외부에 있는 AudioClip을 Play 하는 용도로 사용된다

사운드 포탄 발사시의 음향과 포탄이 명중하여 폭발할 때의 효과음을 적용할 준비가 된 프로젝트는 다음과 같은 환경으로 구성되어 있다



위의 그림에서 Project 뷰의 CannonBall 프리팹은 Hierarchy 뷰에 보이는 Sphere 오브젝트를 사용하여 생성된 것이다


포탄 발사음과 폭발음 파일(mp3)을 현재 Project 뷰 안으로 임포트한다

CannonSound.zip





Project 뷰 안으로 임포트된 2개의 오디오 소스는 아래와 같다




실린더(대포) 오브젝트에 포함할 스크립트를 아래처럼 작성하고 Hierarchy 뷰의 Cylinder 에게 드래그하여 포함시킨다. 대포 발사음 효과를 내는 내용이다

#pragma strict

var prefab:GameObject;

var fireRate : float = 0.5;

var nextFire : float = 0.0;

var fireSound: AudioClip;


function Start () { 

}


function Update () {


if(Input.GetButton("Fire1") && Time.time > nextFire) {// left ctrl or mouse left

nextFire = Time.time + fireRate;

var cannonBall:GameObject = Instantiate(prefab, transform.position, transform.rotation) as GameObject;

Physics.IgnoreCollision(cannonBall.collider, collider);

//포신에 해당하는 실린더의 출구는 Y축 방향이며 포신을 앞쪽으로 기울여 놓은 상태임

cannonBall.rigidbody.AddForce(transform.up*1000); // 포탄의 속도와 방향

audio.PlayOneShot(fireSound);//아규먼트로 오디오 클립을 전달해야 함

}

}



Sphere 에 포함할 스크립트. 포탄이 타겟에 명중할 때 폭발음 효과를 내는 내용이다.

CannonBall 프리팹에 바로 포함하지 않고 CannonBall의 원형인 Sphere 에 스크립트와 Audio Source 콤포넌트를 추가하고 Prefab : Apply 버튼을 누르면 Sphere 에 적용했던 사항들이 모두 그 프리팹에도 적용된다. 아래의 스크립트를 작성하고 Hierarchy 뷰의 Sphere 에게 드래그하여 포함시킨다

#pragma strict


var explosionSound:AudioClip;


function Start () {

}


function Update () {

}


function OnCollisionEnter(collision:Collision) {


var hitName:String = collision.transform.name;

if(hitName=='Target') {

audio.PlayOneShot(explosionSound);

Destroy(gameObject,1);       //목표에 명중한 포탄은 1초만에 사라진다

}else{                                

Destroy(rigidbody, 3);        // 목표에 맞지않은 포탄은 사라지지 않고 3초후에 움직임을 멈춘다

}

}


위의 스크립트가 Sphere와 Cylinder 오브젝트에 추가되었다면 그 스크립트에 public 변수로 선언된 AudioClip을 Inspector 뷰에서 할당할 순서이다

Sphere 스크립트에 선언된 explosionSound 오디오 클립을 아래처럼 드래그하여 할당한다





대포(Cylinder) 오브젝트 스크립트에 선언된 fireSound 변수를 Inspector 뷰에서 아래 그림과 같이 드래그하여 할당한다




또 한가지 잊기 쉬운 절차는 위의 스크립트에서 효과음을 내는 부분을 분석해보면.....

audio.PlayOneShot(fireSound);

이 행에서 audio 객체는 게임 오브젝트에 추가한 Audio Source 콤포넌트를 의미하며,

fireSound 는 AudioClip 객체를 의미한다.

그러므로 PlayOneShot() 함수를 사용하려면 먼저 AudioSource 객체가 필요하므로 대포와 포탄 오브젝트에 각각 Audio Source 콤포넌트를 추가해야 오류가 발생하지 않게 된다







위와 같이 Audio Source 콤포넌트를 추가한 다음에 Hierarchy 뷰에서 해당 오브젝트를 선택하고 inspector 뷰에서 다음과 같이 설정한다

특히 주의해야 할 부분은 Play On Awake 항목을 체크 해제하는 것이다. SphereCylinder 각각 아래처럼 설정해야 한다



위에서 Sphere 에 적용한 스크립트와 Audio Source 콤포넌트는 CannonBall 프리팹에 적용되어야 하므로 아래처럼 Sphere 선택하고 Apply 버튼을 눌러 주면 된다




위의 절차를 마치고 Play 모드로 테스트하면 된다

포탄 발사음폭발음이 제대로 출력되면 성공이다