using System.Collections;
using UnityEngine;
using Firebase;
using Firebase.Database;
public class dailyendcheck : MonoBehaviour
{
private DatabaseReference databaseReference;
public DateManager datemanager;
int dailyend2;
private void Start()
{
// Firebase 초기화
FirebaseApp.CheckAndFixDependenciesAsync().ContinueWith(task =>
{
if (task.Result == DependencyStatus.Available)
{
// Firebase 초기화 성공
databaseReference = FirebaseDatabase.DefaultInstance.RootReference;
Debug.Log("Firebase 초기화 완료!");
StartCoroutine(CheckdailyendRoutine());
}
else
{
Debug.LogError($"Firebase 초기화 실패: {task.Result}");
}
});
}
private IEnumerator CheckdailyendRoutine()
{
// 1분마다 반복 실행
while (true)
{
CheckdailyendStatus();
yield return new WaitForSeconds(60f);
}
}
private void CheckdailyendStatus()
{
Debug.Log("확인 과정 실행");
string id = MyScript.Instance.userId;
string path = $"personal information/server/7/users/{id}/dailyend";
databaseReference.Child(path).GetValueAsync().ContinueWith(task =>
{
if (task.IsFaulted)
{
Debug.LogError("데이터 읽기 실패");
}
else if (task.IsCompleted)
{
DataSnapshot snapshot = task.Result;
if (snapshot.Exists)
{
int dailyend = int.Parse(snapshot.Value.ToString());
if (dailyend == 1)
{
Debug.Log("dailyend가 1입니다!");
datemanager.Nextday();
UpdatedailyendToZero(path);
}
}
else
{
Debug.LogError("데이터가 존재하지 않습니다.");
}
}
});
}
void Update()
{
if(dailyend2 == 1)
{
//datemanager.Nextday();
dailyend2 = 0;
}
}
private void UpdatedailyendToZero(string path)
{
Debug.Log("초기화1");
databaseReference.Child(path).SetValueAsync(0).ContinueWith(task =>
{
Debug.Log("초기화2");
if (task.IsCompleted)
{
Debug.Log("dailyend 값을 0으로 업데이트 했습니다.");
}
else
{
Debug.LogError("값 업데이트 실패");
}
});
}
}
안녕하세요. 저는 유니티 앱으로 firebase와 통신하는 기능을 제작 중입니다
realtimedatabase에 있는 dailyend가 1이 되면
클라이언트(앱)에서 이를 감지해 특정 코드 Nextday();를 실행 후
dailyend를 0으로 초기화 하는 코드입니다
문제는 다음과 같습니다
앱 실행 중 dailyend가 1이 된다?
의도대로 정상 작동합니다
nextday()가 실행되고 dailyend가 0이 되죠
다만 앱이 종료된 상태에서 dailyend가 1이다?
이 경우, 앱을 실행 해도 dailyend만 초기화 되고
nextday()는 실행이 안 됩니다
여기서 끝이 아닙니다
정말 이상한 점은
dailyend를 초기화 하는 함수 내부에
Debug.Log("초기화1"); 등
디버그 로그가 전혀 출력되지 않습니다
전 한 가지 가설을 세웠습니다
어쩌면 앱이 시작하자마자
타 오브젝트를 참조 해야하는 nextday() 함수를 실행하니까
그 부분만 작동하지 않는게 아닐까?
논리적으로 말이 안되는 가설이지만
한번 테스트 해봤습니다
여기서 정말 이상한 점 하나 더 나옵니다
dailyend 값을 검사하는 함수를
아예 실행하지 않았음에도 불구
앱을 실행하면 dailyend만 무조건 0으로 초기화됩니다 (그 외 어떠한 코드, 로그도 작동 x)
다만 앱을 실행 중인 상태에서 dailyend가 1이 되면
nextday() 등 다른 코드도 정상적으로 실행됩니다
+즉, dailyend가 1인 상태에서 앱 실행 시에만
문제가 터진다는 겁니다
+말이 안 되는게 dailyend를 0으로 초기화 하는 코드는
debug.log 및 nextday()등 다른 코드들의 실행 후
작동하게 되어있습니다
근데 다른 코드는 하나도 작동 하지 않고
dailyend만 초기화 된다?
전 여기서부터 뭔가 이상함을 느끼고
dailyend를 1이 아닌 3, 5 등 다른 숫자로 바꿔 테스트 했습니다
+
여전히 0이 됩니다
같은 버그가 발생한다는 겁니다
dailyend가 1인 경우에만 작동한다는
조건문도 무시하고
지 혼자 다 해먹고 있습니다
여전히 앱을 키면 dailyend만 초기화되고
nextday()등 다른 코드는 작동 할 생각을 안 합니다
+
+말 그대로 원인 조차 가늠 안되는
미친 버그입니다
제가 원하는 바는 간단합니다
+저 초기화 코드가 아무런 제어가 안 되는 이유를 찾고
버그를 해결 하고 싶습니다
현업인 분들도 많이 계시는 걸로 알고 있습니다.
도와주시면 정말 감사하겠습니다.
참고로 리스너를 쓰지 왜 저렇게 비효율적으로 1분마다 검사 하냐고 하시는 분 계실까봐 말 하지만 리스너를 써도 버그를 똑같아서 방식을 바꿔본 겁니다. 리스너 등록은 수동으로 버튼을 눌러야 되며, 게임 종료 시 리스너 다 삭제되도록 설정하고 앱을 껐다 켰는데 바로 dailyend 초기화됩니다. 진짜개씨발ㅋㅋ 리스너 달려면 수통 버튼 눌러야 하고 그 버튼 누르지도 않았는데 지 멋대로 초기화됩니다 여전히 nextday()는 작동 안 하고요
Update문은 뭐임 dailyend2가 1인지 확인하고 0으로만 바꾸는 코드가 왜 들어가잇음?
그거 그냥 다른 코드 시도해보려다 말은 거에요 ㅋㅋ 의미없는 코드입니다
근데 이런건 그냥 디버그 한번하면 아는문제 아닌교?
아니면 가끔 버그로 지웠던 코드가 컴파일 되지 않고 남아서 실행되는 버그가 있긴함 이건 유니티 재실행 하면 풀리긴하는데 다시 켜보긴했었나
본문에 써놨다시피 디버그 로그 아예 안 찍힙니다. 디버그랑 상관없이 초기화만 됩니다 그리고 유니티 재실행은 물론 여러가지 모바일 환경에서 수 차례 테스트 해봤는데 저러네요
디버그 로그가 아니라 디버깅 모드써서 어디서 값이 변하는지 확인하면되자너
걍 다른데서 값이 0되서 그런거 같은데 데이터베이스에서 값 변경하면서 테스트한거지?
윗댓처럼 보통 이런건 딴데에서 0으로 만들고있는건데
dailyend를 자동 프로퍼티로 바꾸고 set될때 디버그로 클래스이름 찍어보셈 - dc App
진짜 진짜 감이 안잡힐땐 f10, f11 누르면서 한줄 한줄 디버깅 하셈 어지간하면 찾음
dailyend의 상위 경로중 하나에 값을 썼을 가능성이 있습니다. - dc App