Unity에서 Firebase Database 사용해보기

사전 준비

에셋설치


유니티 에디터에서 동작하도록 구성

FirebaseApp.DefaultInstance.SetEditorDatabaseUrl("https://demofirebase2-63523422.firebaseio.com/"); FirebaseApp.DefaultInstance.SetEditorP12FileName("demofirebase2-90fc700519ad.p12"); FirebaseApp.DefaultInstance.SetEditorServiceAccountEmail("demofirebase2-63523422@appspot.gserviceaccount.com"); FirebaseApp.DefaultInstance.SetEditorP12Password("notasecret");

Firebase 콘솔화면에서 Database에 있는 링크주소를 SetEditorDatabaseUrl 함수 파라미터에.


Firebase 콘솔화면 프로젝트 설정에서 Firebase Project ID를 찾고,

https://console.cloud.google.com/iam-admin/serviceaccounts/project?project=<your firebase project id>로 연결하면 서비스 계정 ID를 확인할 수 있다.


서비스 계정 ID를 SetEditorServiceAccountEmail 함수 파라미터에,


비공개키 만들기


비공개 키 파일을 유니티 프로젝트 폴더(Editor Default Resources)에 복사


p12 파일이름과 비밀번호를 각 각 SetEditorP12FileName, SetEditorP12Password 함수 파라미터에,

유니티 코드

더 자세한 API는 여기서(Firebase Database API)


테스트할 샘플 코드

디버깅하면서 실시간으로 콘솔화면에서 확인

현재는 텅비어 있다.


OnClickSave() 실행 후, testUserId가 추가되었다.


OnClickSave2() 실행 후, testUserId1이 추가되었다.


OnClickUpdateChildren() 실행 후, username이 수정되고, score가 추가되었다.


OnClickPush() 실행 후, scores, user-scores에 신규 키를 생성하여 점수를 등록하고, 

users/testUserId/scoreKey를 추가하였다. 이 모든 것을 한번에 실행할 수 있다.


OnClickRemove() 실행 후, 제거하였다.


OnClickMaxScores() 실행하면, 트랜잭션 걸고 높은 점수로 5개까지 저장하기가 된다.


OnClickOrderBy()는 정렬은 클라에서 처리해야한다.

즉, [1,11,2,5,7] 점수가 있고, OrderByValue().LimitToLast(3) 정렬과 필터링 함수를 함께 사용하면

11,5,7이 넘어온다.




리스너 등록한 후, 데이터가 어떻게 넘어오는지 디버깅 해보았다.

ChildAdded


ChildChanged


ChildRemoved

변경된 노드의 데이터가 모두 넘어온다.

즉, 노드내에 username을 수정하지 않아도, 해당 노드가 수정되었다면, username도 포함되어 넘어온다.

보안 규칙

인증된 유저만 읽고, 쓸 수 있게 하되,

쓰기 할 때는 자신의 유저 노드에만 쓰지, 타 유저 노드에는 쓸 수 없게 규칙을 등록했다.

Firebase 콘솔화면에서 Database->규칙탭에서 만들 수 있다.


쓰기 성공


인증하지 않은 경우 쓰기 실패


인증은 했지만 다른 노드에 쓰려고 할 때, 쓰기 실패


읽기 성공


인증하지 않고 읽으면, 읽기 실패


유니티 에디터에서는 보안규칙을 무시하고 데이터가 등록된다.

apk로 빌드해 실제로 테스트 하면, 퍼미션 오류가 뜨는걸 확인할 수 있다.

07-26 15:49:21.660: I/Unity(3569): RepoOperation:setValue at /users/testUserId/username failed: DatabaseError: Permission denied 07-26 15:49:21.660: I/Unity(3569): 07-26 15:49:21.660: I/Unity(3569): (Filename: ./artifacts/generated/common/runtime/DebugBindings.gen.cpp Line: 51) 07-26 15:49:21.670: I/Unity(3569): OnClickSave::IsCompleted:True IsCanceled:False IsFaulted:True 07-26 15:49:21.670: I/Unity(3569): 07-26 15:49:21.670: I/Unity(3569): (Filename: ./artifacts/generated/common/runtime/DebugBindings.gen.cpp Line: 51)

인증 후, 데이터를 저장하는 코드를 추가해보자.


정상적으로 데이터가 저장되었다.