내가하고 싶은 것
Unity를 사용하는 작은 게임이 있는데, 나중에 리더 보드를 표시하기 위해 Firebase 실시간 데이터베이스에 사용자 점수를 저장하고, 사용자가 처음 게임에 들어갈 때 사용자 이름을 묻고 장치를 식별하기 위해 deviceId로 저장합니다. 따라서 이제 사용자가 인터넷에 연결되어 있지 않은 상황을 처리하고 해당 데이터를 기기에 저장하고 사용자가 연결을 얻거나 게임에 다시 들어가면 firebase 실시간 데이터베이스에서 데이터를 업데이트합니다.
내 문제는 무엇입니까
여기서 문제는 firebase가 연결이 없다는 예외를 던지지 않고 연결될 때까지 인터넷 연결을 계속 시도한다는 것입니다. 사용자가 게임에 들어갈 때 인터넷 연결을 확인하도록 제안 할 수 있지만, 예를 들어 사용자가 인터넷 연결로 시작하고 게임 중에 사용자가 인터넷을 잃게되는 상황에서도 처리하고 싶습니다. 위에서 언급했듯이 장치에 데이터를 저장합니다. 따라서 장치에 데이터를 저장하려면 인터넷에 연결되지 않은 상황을 파악해야합니다.
내가 시도한 것
1)
DatabaseReference connectedRef = FirebaseDatabase.DefaultInstance.GetReference(".info/connected");
connectedRef.ValueChanged += (object sender, ValueChangedEventArgs a) => {
bool isConnected = (bool)a.Snapshot.Value;
Debug.Log(isConnected);
};
게임 도중 사용자가 인터넷 연결이 끊어지면 실행되지 않으므로 인터넷 연결 예외가 없습니다.
2)
Task timeoutTask = Task.Delay(1000);
Task firebaseConnection = await database.Child("users").GetValueAsync();
if (await Task.WhenAny(firebaseConnection, timeoutTask) == firebaseConnection) {
Debug.Log("timeout");
} else {
Debug.Log("completed");
}
나는 파이어베이스 연결에 시간 제한을 두는 것이 현재 유일한 해결책이라고 생각했지만 Debug.Log("timeout");
인터넷에 연결되어 있지 않으면 절대로 기록 되지 않습니다 .
나는 이것에 대한 해결책을 찾고 있었고 작동 할 수있는 것처럼 보이는 2 가지 답변 만 찾았지만 운이없고 아이디어가 부족 하고이 문제를 해결하는 방법을 모릅니다. 귀하의 도움을 기대합니다. 감사합니다.
편집하다:
다음 코드 는 MacOS의 Unity SDK 6.15.1 및 6.13 용 편집기에서 내 컴퓨터에서 작동 합니다.
FirebaseDatabase.DefaultInstance.GetReference(".info/connected").ValueChanged += HandleConnectedChanged;
FirebaseDatabase.DefaultInstance.GetReference(".info/serverTimeOffset").ValueChanged += HandleServerTimeOffsetChanged;
private void HandleServerTimeOffsetChanged(object sender, ValueChangedEventArgs e)
{
Debug.Log($"Offset: {e.Snapshot.Value}");
}
private void HandleConnectedChanged(object sender, ValueChangedEventArgs e)
{
Debug.Log($"Connected: {e.Snapshot.Value}");
}
"연결 없음"상태로 전환하는 데 시간이 다소 걸릴 수 있지만 (예를 들어 WiFi를 끄면 즉시 트리거되지 않음) GoOffline()
및 에 즉시 응답합니다 GoOnline
.
주석을 요약하려면 :
".info/connected"
iOS 및 Android SDK에서 구현되므로 기기에서 사용할 수 있습니다. Unity 에디터에서 테스트 할 때 C ++ 로 작성된 플랫폼 별 백엔드 SDK 의 재 구현이 대신 사용됩니다. 대신 ".info/connected"
완전히 구현 된 것과 같은 특수 노드가 없습니다 (6.15.1 기준). 실시간 데이터베이스의 현재 연결된 상태와 관련된 로직을 테스트하려면 실제 기기에 배포해야합니다.
또한 주로 ValueChanged
데이터를 읽고 데이터 RunTransaction
를 쓰는 데 의존 할 수있는 방식으로 게임을 디자인하십시오 . 이를 통해 다양한 네트워킹 조건에서 탄력성을 제공하고 경쟁 조건에 대한 게임을 강화할 수 있으며 빠른 테스트 목적으로 필요한 경우 Unity 에디터에서 작동합니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다