서버에 파일을 올리고 내려받는법을 알아보자.
본인의 콘솔에 들어가면 빌드 아래에 Storage라는 항목이 있다.
여기 들어가서
시작하기를 눌러 버킷을 생성해주자.
생성됐다면, 이제 유니티에 FirebaseStorage 패키지 파일을 설치하자.
이전 글부터 따라왔다면 이전에 받은 압축파일 내에 패키지파일이 있을것이다.
이걸 유니티에 임포트시켜주자.
유니티의 셋팅은 이렇게 했다.
이미지를 로드할 버튼과, 업로드할 버튼을 만들고, 이미지를 로드했을 때 Image UI에 이미지가 로드되게 설정했다.
각 버튼엔 다음 스크립트를 붙여준다.
LoadImg.cs
//생략
using UnityEngine.UI;
using Firebase.Storage;
using Firebase;
using Firebase.Extensions;
using UnityEngine.Networking;
using Unity.VisualScripting;
using System;
public enum Extension{ //확장자를 위한 enum
jpg,
png
}
public class LoadImg : MonoBehaviour
{
[SerializeField] Image img; //이미지를 로드할 Img;
[SerializeField] string imgName; //이미지 이름
[SerializeField] Extension extension; //확장자 선택
FirebaseStorage storage;
StorageReference storageRef;
IEnumerator ImgLoad(string mediaUrl){
UnityWebRequest req = UnityWebRequestTexture.GetTexture(mediaUrl); //업로드된 텍스쳐 이미지 링크로 이미지 받아옴.
DownloadHandlerTexture tex = new DownloadHandlerTexture(true);
req.downloadHandler = tex;
yield return req.SendWebRequest(); //서버의 응답을 받아옴.
if(req.result == UnityWebRequest.Result.ConnectionError || req.result == UnityWebRequest.Result.ProtocolError){
Debug.Log(req.error);
} else{ //텍스쳐 변환
Texture2D t = tex.texture;
Sprite s = Sprite.Create(t, new Rect(0,0,t.width, t.height),Vector2.zero, 1f);
img.sprite = s;
}
}
public void Load() {
storage = FirebaseStorage.DefaultInstance;
storageRef = storage.GetReferenceFromUrl("gs://unitytest-eaefc.appspot.com"); //이전에 만들어둔 저장소
StorageReference img = storageRef.Child(imgName + "." + extension); //이미지 이름
Debug.Log($"로드할 파일 이름은 {imgName}.{extension}");
img.GetDownloadUrlAsync().ContinueWithOnMainThread(task =>{
if(!task.IsFaulted && !task.IsCanceled){
print(Convert.ToString(task.Result));
StartCoroutine(ImgLoad(Convert.ToString(task.Result))); //파일이 존재한다면 코루틴 실행
}
else{
Debug.Log($"파일이 존재하지 않습니다!");
}
});
}
}
스크립트에서 이미지의 확장자를 enum으로 설정했다.
버튼에 스크립트를 붙이면 이렇게 뜬다.
이름에 파일 이름을 넣고, 확장자를 선택해준다.
그러고 로드를 하면 사진이 로드된다.
UploadImg.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Firebase.Storage;
public class UploadImg : MonoBehaviour
{
FirebaseStorage storage;
StorageReference storageRef;
[SerializeField] string filename;
[SerializeField] Extension extension;
private void Start() {
storage = FirebaseStorage.DefaultInstance;
}
public void Upload(){
storageRef = storage.RootReference.Child(filename + "." + extension);
//경로는 프로젝트 파일 내의 StreamingAssets 안의 파일로 들어감.
string localfile = "file://" + Application.streamingAssetsPath + "/" + filename + "." + extension;
Debug.Log(localfile);
storageRef.PutFileAsync(localfile).ContinueWith(task=>{
if(task.IsCompleted){
Debug.Log($"Successful");
}
});
}
}
사진을 업로드할 땐, 우리가 이전에 만들어둔 StreamingAssets폴더 안의 파일이 업로드된다.
따라서 이미지를 업로드할거면 폴더 안에 파일을 배치해주어야한다.
또한, 폴더 안에 폴더를 생성했다면, StreamingAssets폴더를 루트 폴더로 보고 폴더 링크를 작성해주면 된다.
"file://" + Application.streamingAssetsPath + "/" + filename + "." + extension;
여기서
"file://" + Application.streamingAssetsPath + "/" + "폴더이름" + "/" + filename + "." + extension;
로 변경해주면 된다.
유니티에서 파일 입출력에 관한 문서는 다음을 참고하자
DownloadHandler 생성 - Unity 매뉴얼
다음과 같은 몇 가지 DownloadHandler 타입이 있습니다.
docs.unity3d.com
'Develop > Firebase' 카테고리의 다른 글
[Firebase] Firebase를 이용한 서버 구현 (FireBase) - 4. 로그인/ 회원가입 (0) | 2024.06.17 |
---|---|
[Firebase] Firebase를 이용한 서버 구현 (FireBase) - 2. 시작 스크립트 작성 (0) | 2024.06.13 |
[Firebase] Firebase를 이용한 서버 구현 (FireBase) - 1. FireBase가입 (0) | 2024.06.13 |