5-4. 7조(ForMyDaughter) - Audio Mixer, SceneChanger 수정, Spike Trap

keubung·2024년 11월 18일

1. Audio Mixer

: 전체 볼륨과 배경음, 효과음을 각각 따로 조절하기 위해 Audio Mixer 사용

  • UI에 Slider 추가
  • AudioMixer를 만들고 Master, BGM, SFX 를 추가하고 각각의 Attenuation의 Volume을 우클릭하여 Expose 'Volume (of test)' to script를 눌러 Volume옆에 화살표가 생기도록 해줌.
  • 각 Audido Source의 Output에 BGM과 SFX 중 맞는 것을 선택.
    public class AudioMixerController : MonoBehaviour
    {
        [SerializeField] private AudioMixer m_AudioMixer;
        [SerializeField] private Slider m_MusicMasterSlider;
        [SerializeField] private Slider m_MusicBGMSlider;
        [SerializeField] private Slider m_MusicSFXSlider;
    
        private void Awake()
        {
            m_MusicMasterSlider.onValueChanged.AddListener(SetMasterVolume);
            m_MusicBGMSlider.onValueChanged.AddListener(SetMusicVolume);
            m_MusicSFXSlider.onValueChanged.AddListener(SetSFXVolume);
        }
    
        public void SetMasterVolume(float volume)
        {
            m_AudioMixer.SetFloat("Master", Mathf.Log10(volume) * 20);
        }
    
        public void SetMusicVolume(float volume)
        {
            m_AudioMixer.SetFloat("BGM", Mathf.Log10(volume) * 20);
        }
    
        public void SetSFXVolume(float volume)
        {
            m_AudioMixer.SetFloat("SFX", Mathf.Log10(volume) * 20);
        }
    }

2. SceneChanger 수정

  • 한 스테이지가 끝나면 다음 스테이지로 넘어갈 수 있도록 수정(임시)
  • 인게임 중에 게임을 저장하고 TitleScene으로 나올 수 있도록 수정(임시, 현재는 PlayerPrefs 사용)(게임 일시정지 기능 필요, 나중에 다른 스크립트로 따로 뺄 수 있음.)
  • 게임 저장 기능 추가(임시, 현재는 PlayerPrefs 사용)(현재 씬의 이름을 저장, 플레이어 쪽으로 뺄 수 있음, 위치(세이브 포인트 필요할 수도)와 아이템(버프)도 저장해야 함.)
    public class SceneChanger : MonoBehaviour
    {
        //public SceneAsset scene;
    
        public void StartButton()
        {
            //if (scene != null)
            //{
            SceneManager.LoadScene("stage1");
            //}
        }
    
        public void LoadGame()
        {
            string savedStage = PlayerPrefs.GetString("SavedStage", "Stage1");
            SceneManager.LoadScene(savedStage);
        }
    
        public void GoToTitle()
        {
            SaveGame();
            SceneManager.LoadScene("TitleScene");
        }
    
        private void SaveGame()
        {
            string currentScene = SceneManager.GetActiveScene().name;
            PlayerPrefs.SetString("SavedStage", currentScene);
            PlayerPrefs.Save();
        }
    
        public void NextStage()
        {
            string currentScene = SceneManager.GetActiveScene().name;
            string nextScene = "";
    
            if (currentScene == "Stage1") nextScene = "Stage2";
            else if (currentScene == "Stage2") nextScene = "Stage3";
            else if (currentScene == "Stage3") nextScene = "TitleScene";
    
            SceneManager.LoadScene(nextScene);
        }
    
        public void Exit()
        {
    #if UNITY_EDITOR
            UnityEditor.EditorApplication.isPlaying = false;
    #else
                Application.Quit();
    #endif
        }
    }

Obstacle - SpikeTrap

  • 가시에 닿이면 1초마다 5씩 데미지를 받도록 하였음.
  • 임시로 PlayerInfo가 있다고 가정하고 작성.(아직 플레이어가 완성되지 않았음)
        public float damagePerSecond = 5f;
        private bool isDamaging = false;
    
        private void OnTriggerEnter(Collider other)
        {
            if (other.CompareTag("Player") && !isDamaging)
            {
                StartCoroutine(ApplyDamage(other));
            }
        }
    
        private void OnTriggerExit(Collider other)
        {
            if (other.CompareTag("Player"))
            {
                StopAllCoroutines();
                isDamaging = false;
            }
        }
    
        private IEnumerator ApplyDamage(Collider player)
        {
            isDamaging = true;
    
            while (isDamaging)
            {
                PlayerInfo playerInfo = player.GetComponent<PlayerInfo>(); // PlayerInfo 스크립트가 있다고 가정
                if (playerInfo != null)
                {
                    playerInfo.health -= damagePerSecond;
                    Debug.Log("Player damaged! Current health: " + playerInfo.health);
                }
    
                yield return new WaitForSeconds(1f); // 1초 간격으로 데미지 적용
            }
        }
profile
김나영(Unity_6기)

0개의 댓글