상세 컨텐츠

본문 제목

유니티 부딪혔을때 소리 중복 안나게 하기

카테고리 없음

by MJ_119 2024. 8. 26. 21:15

본문

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;

public class CollisionHandler : MonoBehaviour
{
    public float nextLevelDelayTime;
    AudioSource audioSource;

    public AudioClip crashSound;
    public AudioClip successSound;

    bool isTransition = false;

    private void Start()
    {
        audioSource = GetComponent<AudioSource>();
    }

    private void OnCollisionEnter(Collision collision)
    {
        if (isTransition)
        {
            return;
        }

        switch (collision.gameObject.tag)
        {
            case "Friendly":
                print("a");
                break;

            case "Finish":
                FinishSuccessSequence();
                break;

            case "Fuel":
                print("c");
                break;

            default:
                // 씬 다시 불러오기
                StartCrashSequence();
                break;
        }
    }

    void FinishSuccessSequence()
    {
        // 움직임 금지하기
        GetComponent<Move>().enabled = false;
        
        audioSource.Stop();
        
        // 마지막에 도달했을때 소리 재생
        audioSource.PlayOneShot(successSound);

        // N초 후에 씬 재시작 하기
        Invoke( "NextScene", nextLevelDelayTime);

        isTransition = true;
    }

    void StartCrashSequence()
    {
        if (isTransition)
        {
            return;
        }
        // 움직임 금지하기
        GetComponent<Move>().enabled = false;

        audioSource.Stop();
        
        // 부딪혔을때 소리 재생
        audioSource.PlayOneShot(crashSound);

        // N초 후에 씬 재시작 하기
        Invoke( "LoadScene", nextLevelDelayTime);

        isTransition = true;
    }

    private void NextScene()
    {
        // 다음 레벨로 넘어가기
        int CurrentScene = SceneManager.GetActiveScene().buildIndex;
        int nextScene = CurrentScene + 1;

        // 마지막 레벨(스테이지)을 클리어하면 처음 레벨로 돌아가기
        if ( nextScene == SceneManager.sceneCountInBuildSettings ) // 빌드세팅에 있는 씬의 개수 카운트해서 비교
        {
            nextScene = 0;
        }
        SceneManager.LoadScene(nextScene);
    }

    private void LoadScene()
    {
        //SceneManager.LoadScene(0);
        // 현재 재생중인 씬을 다시 불러오기
        int CurrentScene = SceneManager.GetActiveScene().buildIndex;
        SceneManager.LoadScene(CurrentScene);
    }
}

 

 

아래 코드를 사용해서 bool 값을 확인하여 두개 이상의 중복 사운드가 재생되지 않게 함.

        if (isTransition)
        {
            return;
        }

 

if (isTransition) { return; } 조건문은 isTransition이 true일 때, 이후의 코드를 실행하지 않도록 하기 위해 사용됩니다.

  이는 중복 충돌 처리나 씬이 이미 재시작되고 있는 상황에서 추가적인 처리나 충돌 로직이 실행되지 않도록 하는 중요한 역할을 합니다.