본문 바로가기
IT

[유니티/VR 콘텐츠 제작] 10. 컨트롤러 상호작용 효과음 추가 + AudioManager 세팅하기

by 배애앰이 좋아 2024. 2. 6.
반응형

 

목표 : 유니티 VR 콘텐츠 제작하는 방법에 대해 알아봅시다.

 

https://www.youtube.com/watch?v=pm9W7r9BGiA&list=PLpEoiloH-4eM-fykn_3_QcJ-A_MIJF5B9&index=3

영상을 기반으로 작성된 글입니다.

사용한 유니티 버전 : 2022.3.16f
사용한 VR 기기 : meta quest 3

 

 

1. 컨트롤러 상호작용 효과음 추가

 

참고로 해당 영상에서 쓴 오디오 파일은 제공되지 않아 알아서 찾아서 써야합니다.

 

상호 작용했을 때 효과음 나면 좋겠는 오브젝트 하위에 새로운 오브젝트를 생성한 후 아래와 같이 컴포넌트를 설정해줍니다. 하지만 아래를 보면 theme 항목과 interactable source 항목이 빈 것을 볼 수 있습니다.

 

그 다음, 에셋에서 create > affordance theme > audio affordance theme 를 생성해줍니다. 

 

저희는 특정 물건을 선택했을 때, 효과음이 나길 원하기에 grab audio theme 이라 이름을 붙여주고 selected 할 때 특정 소리가 나도록 넣어줍니다.

 

그러고 난 후, 다시 돌아가서 아까 비었던 부분에 생성한 theme 을 넣어줍니다.

 

그 다음, 비어있는 interactable source 항목을 채우기 위해 일일이 넣어주기는 보다 다른 오브젝트에도 편히 사용할 수 있도록 스크립트를 통해 자동으로 부모객체에서 찾아오게 만들어 봅시다.

 

새로운 스크립트를 아래와 같이 생성해줍니다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.XR.Interaction.Toolkit;
using UnityEngine.XR.Interaction.Toolkit.AffordanceSystem.State;

public class AutoFindingInteractableAffordance : MonoBehaviour
{
    // Start is called before the first frame update
    void Awake()
    {
        GetComponent<XRInteractableAffordanceStateProvider>().interactableSource = GetComponentInParent<XRBaseInteractable>();
    }
}

 

그리고 아래와 같이 붙여준 후 실행하면,

 

자동으로 잘 찾아오는 것을 확인할 수 있습니다. 

 

이제 해당 객체를 프리팹으로 만들어서 상호작용 객체 하위에 넣어주면 됩니다.

추가적인 팁으로는 아래와 같이 설정하면 현재 프리팹에서 추가된 설정이 기본 설정이 될 수 있도록 바꿔 줄 수 있습니다.

 

 

2. AudioManager 세팅하기

 

그 다음으로 컨트롤러와 상호작용하는 물체 외 효과음(문 열리는, 엔진) 등을 편하게 넣기 위해

audio manager 라는 오브젝트를 만든 후 audio manager 라는  스크립트를 붙여줍니다. 

audio manager 는 기존에 import 한 환경 에셋에서 제공하는 스크립트입니다.

 

만약 해당 에셋을 안 쓸 경우, 아래처럼 스크립트를 직접 생성해서 붙여줍니다.

using UnityEngine.Audio;
using System;
using UnityEngine;

//Credit to Brackeys youtube tutorial on Audio managers, as the majority of this code and learning how to use it was made by him.
[System.Serializable]
public class Sound
{
    public string name;
    public AudioClip clip;
    [Range(0, 1)]
    public float volume = 1;
    [Range(-3, 3)]
    public float pitch = 1;
    public bool loop = false;
    public bool playOnAwake = false;
    public AudioSource source;

    public Sound()
    {
        volume = 1;
        pitch = 1;
        loop = false;
    }
}

public class AudioManager : MonoBehaviour
{
    public Sound[] sounds;

    public static AudioManager instance;
    //AudioManager

    void Awake()
    {
        instance = this;

        foreach (Sound s in sounds)
        {
            if (!s.source)
                s.source = gameObject.AddComponent<AudioSource>();

            s.source.clip = s.clip;
            s.source.playOnAwake = s.playOnAwake;
            if (s.playOnAwake)
                s.source.Play();

            s.source.volume = s.volume;
            s.source.pitch = s.pitch;
            s.source.loop = s.loop;
        }
    }

    public void Play(string name)
    {
        Sound s = Array.Find(sounds, sound => sound.name == name);
        if (s == null)
        {
            Debug.LogWarning("Sound: " + name + " not found");
            return;
        }

        s.source.Play();
    }

    public void Stop(string name)
    {
        Sound s = Array.Find(sounds, sound => sound.name == name);

        s.source.Stop();
    }
}

 

소리가 날 장소에 대해 각각 audio source 를 붙여주고 3d 로 설정해줍니다.

 

그 다음 아까 audio manager 에서 + 를 눌려서 소리를 아래와 같이 추가해줍니다. 

 

해당 스크립트는 싱글톤으로 되어있어 어디서든 제어가 가능합니다. 

고로 모든 음악에 대해 아래처럼 추가해줍니다.

 

이제 위에서 넣은 음악을 실행시키고 멈추기 위해서는 아래와 같이 AudioManager.instance.play / stop 으로 제어 가능한 것을 볼 수 있습니다. 

 

위에서는 총을 아래서는 문을 타이밍에 맞게 설정해줍니다.

 

엔진 관련된 소리 제어 코드입니다.

 

이후에 테스트해보면, 상황에 맞게 효과음 소리가 잘 나오는 것을 확인할 수 있습니다.

 

 

반응형

댓글