음악을하는 게임이 있습니다. 음소거 토글 버튼을 누르면 게임 음악을 눌렀을 때 음소거되며 다시 누르면 음소거 해제됩니다. 장면을로드 할 때 오디오 볼륨을 저장하는 데 문제가 있습니다. (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
-
답변 # 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.
- unity - setcolor 및 색상이 재설정되지 않는 이유
- c# - 단일성 - 수직으로 움직이는 카메라
- unity - transformpositionx 값 관련 문제
- unity - 변수의 새로운 값을 저장하지 않는 함수?
- unity - 충돌하는 동안 진동을 수정하는 방법은 무엇입니까?
- unity - 문을 열기 위해 압력 패드를 어떻게 만들 수 있습니까?
- unity - C # 스크립트에서 형제 개체의 구성 요소에 대한 참조를 얻으려면 어떻게해야합니까?
- unity - 그가 먼 거리에서 목표물에 가까워 질 때 속도를 늦추도록 변환하는 방법은 무엇입니까?
- unity - 타겟을 이동하고 따라갈 때 왜 흔들림/끊김 현상이 발생합니까?
- unity - 직렬화 된 데이터 손실없이 필드 대신 get 속성을 갖도록 ScriptableObject 확장
업데이트에서 PlayerPrefs.GetFloat를 사용하고 있습니다. 끔찍한 아이디어입니다.
스크립트에 캔버스에 첨부 한 것을 확인했습니다. 대신 SoundManager라는 클래스를 만듭니다. 게임이로드되는 인트로 장면에서 빈 게임 오브젝트에 첨부하십시오. 싱글 톤으로 만들고이 게임 오브젝트에 dontdestroyonload를 설정하십시오.
그런 다음 토글 버튼 클릭으로 간단한 확인을 할 수 있습니다