[TIL] 83 버그 수정, 사운드 추가 빌드 준비 ⭐⭐

업데이트:

카테고리:

태그: , ,




최종 팀 프로젝트 25일차

   [o] 알고리즘 문제 - 53
   [o] 면접 문제 풀기 - 5
   [o] 1,2반 마무리정리 챌~
   [x] 심화주차 강의 듣기.
   [x] 디자인 코드 패턴 이해,정리하기.
   [x] 자료구조 디자인패턴 강의 다시 듣기.







오브젝트 풀 버그

여러종류 동시에 오브젝트풀 사용시 오류가 발생. -> 따로 빼서 오브젝트 풀 사용







사운드 추가

배경음, 배경음페이드 아웃 , 효과음 오브젝트풀로 추가



SoundManager

모든 리소스 캐싱 후 배경음악, 효과음 재생메서드, 수정필요

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

public class SoundManager : MonoBehaviour
{
    private AudioClip _audioClip;
    private AudioMixer _mixer;
    private string _bgFilename;

    private Queue<AudioSource> _bgmQueue = new Queue<AudioSource>();
    private Dictionary<string, AudioClip> _soundDictionary = new Dictionary<string, AudioClip>();

    private Coroutine _coroutine = null;

    public GameObject Prefabs;
    public int Size;
    public Transform SpawnPoint;


    private Queue<GameObject> _poolObject;


    private void Awake()
    {
        _audioClip = GetComponent<AudioClip>();
        _mixer = Resources.Load<AudioMixer>("Sound/AudioMixer");
        intit();
    }

    private void Start()
    {
        var pre = Resources.LoadAll<AudioClip>("Sound");
        foreach (var p in pre)
        {
            _soundDictionary.Add(p.name, p);
        }
        SceneManager.sceneLoaded += LoadedsceneEvent;
        BgmSoundPlay("TitleBGM");
    }

    private void LoadedsceneEvent(Scene scene, LoadSceneMode mode)
    {
        if (scene.name == SceneName.VillageScene)
        {
            _bgFilename = BGMSoundName.VillageBGM1;
        }
        else if (scene.name == SceneName.TycoonScene)
        {
            _bgFilename = BGMSoundName.TycoonBGM1;
        }
        else if (scene.name == SceneName.DungeonScene)
        {
            _bgFilename = BGMSoundName.DungeonBGM;
        }
        else if (scene.name == SceneName.HuntingScene)
        {
            _bgFilename = BGMSoundName.HuntingField;
        }
        if (_bgFilename != null)
        {
            BgmSoundPlay(_bgFilename);
        }
        _bgFilename = null;
    }

    public void SFXPlay(string sfxName, Vector3 audioPosition, float audioVolume)
    {
        GameObject AudioObject = GetSoundObject();
        AudioSource audiosource = AudioObject.GetComponent<AudioSource>();
        _audioClip = _soundDictionary[sfxName];

        if (_audioClip != null)
        {
            audiosource.clip = _audioClip;
            audiosource.volume = audioVolume;
            audiosource.Play();

            StartCoroutine(SFXStop(AudioObject, audiosource));
        }

    }
    public void SFXPlay(string sfxName)
    {
        GameObject AudioObject = GetSoundObject();
        AudioSource audiosource = AudioObject.GetComponent<AudioSource>();
        _audioClip = _soundDictionary[sfxName];

        if (_audioClip != null)
        {
            audiosource.clip = _audioClip;
            audiosource.volume = 0.5f;
            audiosource.Play();

            StartCoroutine(SFXStop(AudioObject, audiosource));
        }

    }
    IEnumerator SFXStop(GameObject AudioObject, AudioSource audiosource)
    {
        yield return new WaitForSecondsRealtime(audiosource.clip.length);
        ReturnSoundObject(AudioObject);
    }


    public void BgmSoundPlay(string BgName)
    {

        if (_bgmQueue.Count != 0)
        {
            AudioSource firstAudio = _bgmQueue.Dequeue();
            if (_coroutine != null)
            {
                StopCoroutine(_coroutine);
            }
            StartCoroutine(BgmVolumeDown(firstAudio));
        }

        GameObject AudioGo = new GameObject(BgName);
        DontDestroyOnLoad(AudioGo);
        AudioSource audiosource = AudioGo.AddComponent<AudioSource>();
        audiosource.outputAudioMixerGroup = _mixer.FindMatchingGroups("BGSound")[0];
        _audioClip = _soundDictionary[BgName];

        if (_audioClip != null)
        {
            audiosource.clip = _audioClip;
            audiosource.loop = true;
            _coroutine = StartCoroutine(BgmVolumeUp(audiosource));
            audiosource.Play();
        }
        _bgmQueue.Enqueue(audiosource);

    }
    IEnumerator BgmVolumeDown(AudioSource bgmsource)
    {
        while (bgmsource.volume > 0.04f)
        {
            bgmsource.volume -= 0.03f;
            yield return new WaitForSeconds(0.3f);
            if (bgmsource == null)
            {
                break;
            }
        }
        Destroy(bgmsource.gameObject);
    }
    IEnumerator BgmVolumeUp(AudioSource bgmsource)
    {
        bgmsource.volume = 0;
        while (bgmsource.volume < 0.3f)
        {
            bgmsource.volume += 0.03f;
            yield return new WaitForSeconds(0.4f);
        }
    }

    public void SetMasterVolume(float volume)
    {
        _mixer.SetFloat("MasterSound", volume);
    }

    public void SetMusicVolume(float volume)
    {
        _mixer.SetFloat("BGSound", volume);
    }

    public void SetSFXVolume(float volume)
    {
        _mixer.SetFloat("SFXSound", volume);
    }

    public void intit()
    {
        _poolObject = new Queue<GameObject>();
        for (int i = 0; i < Size; i++)
        {
            var newObj = Instantiate(Prefabs, SpawnPoint);
            newObj.gameObject.SetActive(false);
            _poolObject.Enqueue(newObj);
        }
    }

    public void ReturnSoundObject(GameObject obj)
    {
        _poolObject.Enqueue(obj);
        obj.SetActive(false);
    }

    public GameObject GetSoundObject()
    {
        GameObject obj = _poolObject.Dequeue();
        obj.SetActive(true);
        return obj;
    }

}







맵 구현

  • RenderTexture를 이용한 구현
  • RenderTexture로 바뀌는 화면에 대한 미니맵 구현 -> 카메라와, 이미지 세팅
  • 문제점 -> 맵을 키면 batches가 너무 늘어났다. RenderTexture의 문제점? 맵전체를 현재화면으로 그려줘서? 문제가 있다.
  • 개선법 -> 맵은 2D화면 사진으로찍어서 이미지 하나로 대체, 캐릭터, 보스의 위치만 실시간으로 RenderTexture와 카메라 image



던전 맵 구현

  • 던전 방 별로 카메라에 표시되는 오브젝트 하나 생성
  • 방 클리어 시 갈 수 있는 방 색변경 -> 맵에 표시 image







기술면접

24. 디자인 패턴(Singleton, Observer 등) 사용하는 이유는 무엇인가요?

  • 코드의 구조화: 디자인 패턴은 코드를 구조화하고 모듈화하여 유지보수와 확장을 쉽게 만듭니다. 코드의 가독성과 유지보수성
  • 재사용성: 디자인 패턴을 사용하면 일반적인 문제에 대한 해결책을 재사용할 수 있습니다. 이는 개발 속도를 높이고 코드 중복을 방지하는 데 도움이 됩니다.
  • 개발자 간의 의사소통: 디자인 패턴은 개발자 간의 의사소통을 촉진할 수 있습니다. 공통된 용어와 개념을 사용하므로 팀원들 간의 협업이 원활해집니다.
  • 유지보수와 확장성: 디자인 패턴은 변경에 대한 유연성을 제공합니다. 프로젝트 요구사항이 변경되거나 새로운 기능이 추가될 때, 디자인 패턴을 통해 코드를 쉽게 수정하고 확장할 수 있습니다.

Unity를 사용하면서 경험해볼 수 있는 대표적인 디자인패턴이 무엇인지 설명해주세요. 상태패턴, 관찰자패턴, 이벤트 버스 패턴, 전략패턴 등이 있습니다.







잡담,정리

오브젝트 풀 생각, 사운드 추가, 디자인패턴, 맵 구현




참고 : 유니티 TOP




📔

댓글남기기