ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • (10) BGM & Sound Effect
    Galaxy Ball/1. 멀티플레이 - 대전모드 2024. 3. 28. 02:28

    이번에는 게임에 필요한 BGM 그리고 효과음을 구현해보도록 하겠다

     

    게임의 BGM은 이곳에서 그리고 게임의 효과음은 아래 사이트에서 구해보았다

     

    게임 효과음 다운로드 | 뮤팟 효과음 태그 검색

    영상 편집자에게 꼭 필요한 무료 효과음 이걸로 종결! 장면전환, 소리효과와 같은 다양한 효과음들을 획득하세요.

    www.mewpot.com

    미리 구해둔 3가지 오디오 소스

     

    추후에 더 많은 효과음들이 늘어날 수 있겠지만 우선 지금 추가해보려는건 3가지다

     

    1. 게임 BGM

    2. 공이 팅길때나는 기본적은 효과음

    3. 승패가 결정되고 씬이 전환될때 나는 효과음

     

    우선 가장 기본이 될 게임 BGM부터 넣어보자

     

    사실 BGM이 가장 간단하지 않을까 싶다. 

    그냥 메인씬에 있는 GameManager에 Audio Source 컴포넌트를 부착한뒤

    BGM으로 쓸 오디오소스를 넣어준뒤 Play On Awake, Loop에 체크를 해준다

     

     

     

    Play On Awake에 체크해주었으니 게임을 시작하자마자 BGM이 틀어지는것을 확인할 수 있다

    끝까지 듣진 않았지만 Loop에 체크를 했으니 무한반복이 될 예정이다

     

    물론 여기까지만 해도 좋지만 그래도 약간은 허전하다.

    볼륨 On/Off 버튼을 통해 BGM을 끄고 키고를 조절할수 있게 하고 싶지만

    이 기능은 나중에 환경설정이라는 씬을 따로 만들면 거기에 구현할 예정이니 우선 넘어가기로 하자

     

    이번엔 공이 충돌할때마다 나는 효과음을 만들어보겠다

     

    사실 한 오브젝트 안에 두개 이상의 오디오를 상황에 따라 재생시키는걸 해본적이 없어

    정말 그냥 되는대로 만들어보았다. 어차피 원하는대로 실행만 되면 되는거니까...

     

    public class BallController : MonoBehaviour
    {
        Rigidbody2D rigid;
        Vector2 lastVelocity;
        float deceleration = 2f;
        public float increase = 4f;
        private bool iscolliding = false;
        public bool hasExpanded = false;
        private bool isStopped = false;
        private int randomNumber;
        private TextMeshPro textMesh;
    
        public AudioSource HitSound;
        public AudioSource SwellSound;

     

    우선 전역변수에 오디오소스 형식의 변수 2개를 BallController에 선언해준다

    공이 충돌할때 날 소리는 Hitsound, 공이 팽창할때 날 소리는 SwellSound로 지정해주었다

     

    우선 Hitsound가 어디에 쓰이는지 생각해보고 적절하게 코드안에 넣어주자

     private void OnCollisionEnter2D(Collision2D coll)
        {
            if (!hasExpanded)
            {
                HitSound.Play();
            }
    
            if ((coll.gameObject.tag == "P1ball" || coll.gameObject.tag == "P2ball") && rigid == null)
            {
                if (randomNumber > 0)
                {
                    randomNumber--;
                    textMesh.text = randomNumber.ToString();
                }
                if (randomNumber <= 0)
                {
                    Destroy(gameObject);
                }
            }
            if (coll.contacts != null && coll.contacts.Length > 0)
            {
                Vector2 dir = Vector2.Reflect(lastVelocity.normalized, coll.contacts[0].normal);
                if (rigid != null)
                    rigid.velocity = dir * Mathf.Max(lastVelocity.magnitude, 0f); // 감속하지 않고 반사만 진행
            }
            this.iscolliding = true;
        }

     

    가장 맨위에, 어느것과 충돌하던 효과음이 나야하기에 가장 맨위에 적어두었고 조건으로 !hasExpanded를 적어둔

    이유는 확장하면서 일어나는 충돌에는 이 효과음이 아닌 SwellSound가 들어가야하기 때문이다

     

     void expand()
        {
            if (rigid == null || iscolliding) return;
            if (rigid.velocity.magnitude > 0.01f) return;
            if (Input.GetMouseButton(0)) return;
            SwellSound.Play();
            transform.localScale += Vector3.one * increase * Time.deltaTime;
            hasExpanded = true;
        }

     

    확장은 당연히 expand 메서드에 모든 조건을 만족시켜 확장되는 순간 SwellSound를 재생시킨다

    이번엔 Audio Source를 2개 만들어준뒤 각각 오디오소스를 넣어준다

    그리고 BGM과 달리 충돌상황에만 재생될 예정이니 Play on Awake, Loop를 둘다 꺼준다

     

    그런 다음 BallController 스크립트에 생긴 변수안에 두 오디오소스의 값을 이름에 맞게 넣어주면 된다

     

     

     

    이제 결과를 확인해보자. 분명 충돌사운드는 잘 나는것같은데 확장 사운드가 뭐랄까...

    확장을 하는 순간 나는게 아니라 확장이 다 끝날때 나는것같다. 분명 코드에서 잘 넣어줬는데 왜 이럴까..?

     

     void expand()
        {
            if (rigid == null || iscolliding) return;
            if (rigid.velocity.magnitude > 0.01f) return;
            if (Input.GetMouseButton(0)) return;
            Debug.Log("팽창 시작");
            SwellSound.Play();
            transform.localScale += Vector3.one * increase * Time.deltaTime;
            hasExpanded = true;
        }

    분명이 확장이 되는 순간 사운드가 재생되게 넣어줬는데 이상하다 싶어 이번엔 디버그를 하나 넣어주고 시작해보자

     

     

     

    아 출력되는것을 보니 알겠다. 타이밍은 맞았으나 expand 메서드 자체가 update에서 실행되기때문에

    재생은 올바른 타이밍에 되지만 프레임마다 사운드가 재생되어 결국 마지막에 재생된 사운드만 들리는것이었다

     

     void expand()
        {
            if (rigid == null || iscolliding) return;
            if (rigid.velocity.magnitude > 0.01f) return;
            if (Input.GetMouseButton(0)) return;
    
            if (!hasExpanded)
            {
                SwellSound.Play();
            }
            transform.localScale += Vector3.one * increase * Time.deltaTime;
            hasExpanded = true;
        }

     

    원인을 알았으니 디버그를 지우고 Swellsound가 딱 한번만 재생될 조건을 걸어주자.

    맨 윗줄에 3가지 조건을 뚫고 내려오는 순간 곧바로 hasExpanded는 true가 되기에 false였을 딱 한번만 

    오디오가 재생되게 만들었다

     

    이제 원하는대로 팽창이 이루어지는 최초 한번만 오디오가 재생되게 만들었다

     

    마지막으로 승패가 결정나고 결과씬으로 넘어가는 순간 특정 오디오 재생이 되도록 만들어보자

     

    이건 간단하다. P1 Win(승패 결정씬)으로 가서 아무 오브젝트나 하나 붙잡고

    오디오소스 컴포넌트 넣어준뒤 거기에 알맞는 오디오 넣고 Play On Awake에 체크해주면

    씬 전환이 일어나는 순간 딱 한번 재생해주게 된다

     

     

     

    이로써 기본적인 BGM, 사운드 이펙트 모두 구현하는데 성공했다. 

    다음 글에서는 턴제를 구현해보겠다

    'Galaxy Ball > 1. 멀티플레이 - 대전모드' 카테고리의 다른 글

    (11) 턴제 시스템  (0) 2024.03.28
    (10.5) - 버그 개선#2  (0) 2024.03.28
    (9) 버그 개선#1  (0) 2024.03.27
    (8) 발사구현 마무리  (0) 2024.03.27
    (7) Firezone, 발사구현  (1) 2024.03.26
Designed by Tistory.