>

음악을하는 게임이 있습니다. 음소거 토글 버튼을 누르면 게임 음악을 눌렀을 때 음소거되며 다시 누르면 음소거 해제됩니다. 장면을로드 할 때 오디오 볼륨을 저장하는 데 문제가 있습니다. (DontDestoryOnLoad를 사용하려고 시도했지만 내 음소거 스크립트가 메인 메뉴 캔버스에 첨부되어 캔버스를 저장하지 않기 때문에 원하지 않습니다. playerprefs를 사용하는 것이 훨씬 쉽습니다.) 예를 들어, 음소거 버튼을 클릭하면 게임이 음소거되고 게임을하고 죽고 게임을 다시 시작하며 볼륨도 다시 시작됩니다. 작동하지 않는 문제를 해결하기 위해 playerprefs를 사용했지만 여전히 같은 일을했습니다. 어쨌든 이것은 내 스크립트입니다 :

public bool mute; 
public static Vector3 target;
void Start ()
{
    PlayerPrefs.GetFloat("mute");
}
void  Update()
{
    PlayerPrefs.GetFloat("mute");
}
private void Muted ()
{
    mute = !mute;
    if (mute) {
        gameObject.GetComponent<AudioSource> ().volume = 0;
        PlayerPrefs.SetFloat("mute", 0);
    }
    else
    {
        gameObject.GetComponent<AudioSource> ().volume = 1;
        PlayerPrefs.SetFloat("mute", 1);
    }
}


  • 답변 # 1

    업데이트에서 PlayerPrefs.GetFloat를 사용하고 있습니다. 끔찍한 아이디어입니다.

    스크립트에 캔버스에 첨부 한 것을 확인했습니다. 대신 SoundManager라는 클래스를 만듭니다. 게임이로드되는 인트로 장면에서 빈 게임 오브젝트에 첨부하십시오. 싱글 톤으로 만들고이 게임 오브젝트에 dontdestroyonload를 설정하십시오.

    public class SoundManager : MonoBehaviour
    {
        public static SoundManager instance;
        public bool mute{
            set{
                PlayerPrefs.SetFloat("muted", value ? 1 : 0);
            }
            get{
                return PlayerPrefs.GetFloat("muted", 0) == 0 ? false : true;
            }
        }
    }
    
    

    그런 다음 토글 버튼 클릭으로 간단한 확인을 할 수 있습니다

    SoundManager.instance.mute != SoundManager.instance.mute;
    gameObject.GetComponent<AudioSource>().mute = SoundManager.instance.mute;
    
    

  • 답변 # 2

    먼저 저장 /로드해야하는 모든 게임 상태 변수를 캡슐화하는 클래스를 생성 한 다음이 클래스에 [Serializable] 태그를 지정해야합니다. 다음 :

    [Serializable]
    public class GameState
    {
    public int Volume;
    public bool mute;
    }
    
    

    이제 클래스를 생성하고이 두 가지 메소드를 추가하고 GameState를 인스턴스화하여이 클래스에 전달하는 것을 잊어 버렸습니다

    public class GameSave : MonoBehaviour {
    public GameState gm;
    public void SaveData()
    {
        if (!Directory.Exists("Saves"))
            Directory.CreateDirectory("Saves");
        BinaryFormatter formatter = new BinaryFormatter();
        FileStream saveFile = File.Create("Saves/save.binary");
    
        formatter.Serialize(saveFile, GameState);
        saveFile.Close();
    }
    public void LoadData()
    {
        BinaryFormatter formatter = new BinaryFormatter();
        FileStream saveFile = File.Open("Saves/save.binary", FileMode.Open);
        gm = (GameState)formatter.Deserialize(saveFile);
        saveFile.Close();
    }
    }
    
    

  • 답변 # 3

    오디오가 음소거되어 있는지 확인하고 복원하지 않았습니다.

    void Start ()
    {
        if(PlayerPrefs.GetFloat("mute") == 0)
        {
         gameObject.GetComponent<AudioSource> ().volume = 0;
        }
        else
        {
         gameObject.GetComponent<AudioSource> ().volume = 1;
        }
    }
    
    

  • 답변 # 4

    Unity 문서에 따르면 :

    와이즈 비즈 와이즈 비즈

    여기서 필요한 것은 GetFloat (key)를 사용하여 PlayerPrefs에 저장된 값을 가져와 AudioSource.volume에 할당하는 것입니다.

    일반적으로 정적 값/참조가있는 경우 (수정되지 않음) 나중에 사용할 수 있도록 시작 기능에서 캐시 할 수 있습니다. 그리고 여기서는 업데이트 기능이 완전히 필요하지 않습니다.

    예를 들어 아래와 같이 코드를 다시 작성합니다.

    https://docs.unity3d.com/ScriptReference/PlayerPrefs.GetFloat.html

    public static float GetFloat(string key, float defaultValue = 0.0F);

    Returns the value corresponding to key in the preference file if it exists. If it doesn't exist, it will return defaultValue.

  • 이전 game design - "스나이퍼"스타일의 플레이를 지원하면서 캠핑을하지 않는 방법은 무엇입니까?
  • 다음 legal - unity personal edition 라이센스 관련 도움이 필요합니다