TIL 0130 게임개발 입문 팀 과제 - 5 / 구현 마무리

강성원·2024년 1월 30일
0

TIL 오늘 배운 것

목록 보기
27/69

오늘 개발한 내용

오디오 매니저 컴포넌트화

"오디오 매니저 컴포넌트화"라는 표현이 맞는지 모르겠지만 일단 설명 들어간다.

기존에는 오디오 매니저가 싱글톤으로 존재하게했다.
하지만 프로젝트의 구현 방향에 맞추기 위해서 게임 매니저에 오디오 매니저를 컴포넌트로 불러오는 방식으로 바꾸었다.

코드가 너무 길어서 잘라서 설명한다.

멤버

public class AudioManager : MonoBehaviour
{
    // ===== BGM =====
    [SerializeField] private AudioClip[] _bgmClip;
    private float bgmVolume = 0.5f;
    private AudioSource bgmPlayer;

    // ===== SFX =====
    [SerializeField] private AudioClip[] _sfxClips;
    private float sfxVolume = 0.5f;
    private readonly int channels = 16;
    private AudioSource[] sfxPlayers;
    private int sfxChannelIndex;

    // ===== Audio Mixer =====
    [SerializeField] private AudioMixer _audioMixer;
    private AudioMixerGroup _bgmMixerGroup;
    private AudioMixerGroup _sfxMixerGroup;
    
    ,,,생략,,,
}

초기화

private void Init()
{
    // 오디오 믹서 초기화
    _audioMixer = Resources.Load<AudioMixer>("Audio/AudioMixer/AudioMixer");
    _bgmMixerGroup = _audioMixer.FindMatchingGroups("Master/BGM")[0];
    _sfxMixerGroup = _audioMixer.FindMatchingGroups("Master/SFX")[0];

    // 배경음 초기화
    GameObject bgmObject = new GameObject("BgmPlayer");
    bgmObject.transform.parent = transform;
    bgmPlayer =  bgmObject.AddComponent<AudioSource>();
    bgmPlayer.playOnAwake = false;
    bgmPlayer.loop = true;
    bgmPlayer.volume = bgmVolume;
    bgmPlayer.outputAudioMixerGroup = _bgmMixerGroup;

    // 배경음 클립 할당
    _bgmClip = new AudioClip[2];
    _bgmClip[(int)BGM.Lobby] = Resources.Load<AudioClip>("Audio/BGM/BGM_Lobby");
    _bgmClip[(int)BGM.ROUND] = Resources.Load<AudioClip>("Audio/BGM/BGM_Round");

    // 효과음 초기화
    sfxPlayers = new AudioSource[channels];
    GameObject sfxObject = new GameObject("SfxPlayer");
    sfxObject.transform.parent = transform;
    sfxChannelIndex = 0;

    for (int i = 0; i < sfxPlayers.Length; ++i)
    {
        sfxPlayers[i] = sfxObject.AddComponent<AudioSource>();
        sfxPlayers[i].playOnAwake = false;
        sfxPlayers[i].loop = false;
        sfxPlayers[i].volume = sfxVolume;
        sfxPlayers[i].outputAudioMixerGroup = _sfxMixerGroup;
    }

    // 효과음 클립 할당
    _sfxClips = new AudioClip[4];
    _sfxClips[(int)SFX.UI_SELECT] = Resources.Load<AudioClip>("Audio/SFX/SFX_UI_Select");
    _sfxClips[(int)SFX.ROUND_START] = Resources.Load<AudioClip>("Audio/SFX/SFX_Round_Start");
    _sfxClips[(int)SFX.ROUND_END] = Resources.Load<AudioClip>("Audio/SFX/SFX_Round_End");
    _sfxClips[(int)SFX.DAMAGED] = Resources.Load<AudioClip>("Audio/SFX/SFX_Damaged");
}

복잡하지만 코드 내용은 볼 필요 없다.

중요한 것은 기존에 인스펙터에서 직접 멤버에 할당해주었던 것을 Resources.Load를 호출하여 스크립트 내에서 해결할 수 있도록 한 것이다.

오늘 있었던 문제

우리 조가 리팩토링을 하고 나서 슬슬 마무리를 하려던 중에 작업 영역이 겹치면서 컨플릭트 축제가 벌어졌다.

내가 잠깐 강아지 산책을 다녀온 사이에 한 명의 코드를 제대로 고쳐놓고 다른 사람들은 리셋하고 고친 코드를 받는 것으로 결정됐고, 그대로 작업을 진행중이었다.

결과적으로 해결은 됐지만 참..여러명이 고생했다.

다음 프로젝트 때는 중간마다 여태까지의 작업 내용이 완벽한 코드를 하나 두고 모두가 다시 그것을 베이스로 작어을 이어나가는 방식을 사용하면 어떨까 싶다.

프로젝트가 작아서 이정도로 끝났지, 다음부터는 좀 더 현명하도록 하자.

profile
개발은삼순이발

0개의 댓글