728x90

1. 개발 현황

https://youtu.be/KyBV90PFU4w?si=0018S-ylUCYIrbIV

 

1. 설정 데이터 저장 로직 추가

1) 설정 값 변경 시, GameManager.Setting 데이터 업데이트 로직 구현

2) 설정 창 종료 시, Setting 관련 데이터 Json 데이터로 저장

- 세팅 후, 볼륨, 언어 등 데이터가 항상 유지되도록 설정

+) 경험한 이슈:

원인:

(1) 메인, BGM, SFX 값을 3개의 슬라이더로 제어

(2) 슬라이더 내 Value 변경 시 데이터 저장 및 볼륨 제어 적용

-> 이때, 다양한 데이터를 연동하여 업데이트를 적용하는 경우, 예상과 다른 onValueChanged 함수 호출로 인해 오류 발생

e.g.)

(1) 게임 시작 시 세팅 값 Load 수행

(2) Setting Data 변수에 Main = 100, BGM = 60, SFX = 30 값 저장 (Setting Data, 100/60/30)

(3) Load 된 세팅 값이 Slider에 반영됨. (Slider.value = 0/0/0 -> 100/0/0)

(4) 이때, 반영 동작은 1개씩 적용이 이뤄지며, 최초 값 반영 후 슬라이더에서 Slider.onValueChanged 함수 호출

(5) ' Slider.onValueChanged' 함수와 연동된 'Setting Data 변수 저장 함수' 동작으로 인해, Setting 데이터 오류 발생

(6) 예상과 달리, Setting Data -> 100/60/30이 아닌 100/0/0이 반영되는 버그 발생 (0/0은 임의의 변수)

해결방안: 세팅 시 하나의 데이터만 제어

 

2. 볼륨 제어 로직 추가

1) 슬라이더 활용, 볼륨 제어

2) 설정된 값 확인용 GUI 제어 로직 추가

 

3. 다국어 언어 제어 시스템 추가

1) String 데이터 일원화

2) 언어 업데이트 로직 추가

 

2. 상세 개발 내용

1. 설정 데이터 저장 로직 추가

1) 설정 값 변경 시, GameManager.Setting 데이터 업데이트 로직 구현

HUD 구성 방법
HUD와 OnValueChanged 함수 연결

    public void SetLanguage()
    {
        GameManager.instance.mSettingData.LanguageType = (Enum.Language)mDropdownLanguage.value;

        GameManager.instance.UpdateText();
    }
    public void SetWindowScreen()
    {
        GameManager.instance.mSettingData.ResolutionNum = mDropdownWindow.value;
        GameManager.instance.mSettingData.Width = Screen.resolutions[mDropdownWindow.value].width;
        GameManager.instance.mSettingData.Height = Screen.resolutions[mDropdownWindow.value].height;
        GameManager.instance.mSettingData.RefreshRate = Screen.resolutions[mDropdownWindow.value].refreshRate;

        Screen.SetResolution(GameManager.instance.mSettingData.Width, GameManager.instance.mSettingData.Height, GameManager.instance.mSettingData.Fullscreen, GameManager.instance.mSettingData.RefreshRate);
    }
    public void SetFullscreen()
    {
        GameManager.instance.mSettingData.Fullscreen = mToggleWindow.isOn;

        Screen.SetResolution(GameManager.instance.mSettingData.Width, GameManager.instance.mSettingData.Height, GameManager.instance.mSettingData.Fullscreen, GameManager.instance.mSettingData.RefreshRate);
    }
    public void SetMasterVolume()
    {
        GameManager.instance.mSettingData.MasterVolume = mMasterVolume.value;
        mTextMasterVolume.text = ((int)(mMasterVolume.value * 100)).ToString();

        GameManager.instance.mBGMPlayer.volume = GameManager.instance.mSettingData.BGMVolume * GameManager.instance.mSettingData.MasterVolume;
        for (int i = 0; i < GameManager.instance.mSFXPlayer.Length; ++i)
        {
            GameManager.instance.mSFXPlayer[i].volume = GameManager.instance.mSettingData.SFXVolume * GameManager.instance.mSettingData.MasterVolume;
        }
    }
    public void SetBGMVolume()
    {
        GameManager.instance.mSettingData.BGMVolume = mBGMVolume.value;
        mTextBGMVolume.text = ((int)(mBGMVolume.value * 100)).ToString();

        GameManager.instance.mBGMPlayer.volume = GameManager.instance.mSettingData.BGMVolume * GameManager.instance.mSettingData.MasterVolume;
    }
    public void SetSFXVolume()
    {
        GameManager.instance.mSettingData.SFXVolume = mSFXVolume.value;
        mTextSFXVolume.text = ((int)(mSFXVolume.value * 100)).ToString();

        for (int i = 0; i < GameManager.instance.mSFXPlayer.Length; ++i)
        {
            GameManager.instance.mSFXPlayer[i].volume = GameManager.instance.mSettingData.SFXVolume * GameManager.instance.mSettingData.MasterVolume;
        }
    }

2) Setting 관련 데이터 Json 데이터로 저장 및 로드

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

[System.Serializable]
public struct SettingData
{
    public Enum.Language LanguageType;
    public float MasterVolume;
    public float BGMVolume;
    public float SFXVolume;
    public int ResolutionNum;
    public int Width;
    public int Height;
    public bool Fullscreen;
    public int RefreshRate;
}
    public SettingData mSettingData;
    
    public void SaveSettingJson()
    {
        string json = JsonConvert.SerializeObject(mSettingData);
        File.WriteAllText(Application.dataPath + "/Datas/SettingData.json", json);
    }
    public void LoadSettingJson()
    {
        string json = File.ReadAllText(Application.dataPath + "/Datas/SettingData.json");
        mSettingData = JsonConvert.DeserializeObject<SettingData>(json);
    }

2. 볼륨 제어 로직 추가

1) 슬라이더 활용, 볼륨 제어

2) 설정된 값 확인 로직 추가

 

3. 다국어 언어 제어 시스템 추가

1) String 데이터 일원화

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

[System.Serializable]
public struct TextJsonData
{
    public Enum.Language Type;
    public string Language;
    public string[] WeaponName;
    [TextArea]
    public string[] WeaponInitDesc;
    [TextArea]
    public string[] WeaponLvUpDesc;
    public string[] PerkName;
    [TextArea]
    public string[] PerkDesc;
    public string[] PlayerName;
    public string[] PlayerDesc;
    public string[] PlayerUnlockName;
    public string[] PlayerUnlockDesc;
    public string[] AchiveDesc;

    public string HUDLevelUpTitle;
    public string[] HUDSetting;
}

 

2) 언어 업데이트 로직 추가

using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
using Newtonsoft.Json;
using UnityEngine.U2D;
using UnityEngine.SceneManagement;

public class GameManager : MonoBehaviour
{
    // 생략
    public HUDGameStart mHUDGameStart;
    public HUDAchive mHUDAchive;
    public HUDInGame mHUDInGame;
    public HUDLevelUp mHUDLevelUp;
    public HUDResult mHUDResult;
    public HUDSetting mHUDSetting;

    public void UpdateText()
    {
        mHUDGameStart.UpdateText();
        mHUDLevelUp.UpdateText();
        mHUDSetting.UpdateText();
    }
}
public class HUDGameStart : MonoBehaviour
{
    RectTransform mRect;
    public GameObject mRootHUD;
    GameObject[] mPlayers;

    public void UpdateText()
    {
        for (int i = 0; i < mPlayers.Length; ++i)
        {
            mPlayers[i].GetComponent<HUDBtnPlayer>().UpdateText();
        }
    }

}

 

 

3. TODO

1. 필드 파괴형 오브젝트 추가 (e.g. 박스, 촛대, etc.)

2. 골드 시스템 추가

3. 강화 시스템 추가

4. 상자 추가

5. 무기 & 퍽 조합 시 무기 업그레이드 로직 추가

6. 게임 이어하기 로직 추가

7. 게임 세이브 슬롯 추가 (3개)

+ Recent posts