[Unity] UnityWebRequest 의 Get, Post 사용하기

외부에서 파일을 다운받기 위해 UnityWebRequest를 사용해보려 한다

UnityWebRequest.Get(URL)

먼저 구글드라이브에서 다운로드 링크를 하나 만들었다

그리고 코드를 작성했는데,
FilePath에서 permission denied가 나서 권한을 어떻게 주어야 하지 싶었다

그런데 알고보니 딱히 권한 설정을 만질 필요는 없었고,
path를 수정해주어야 했는데, 디렉터리가 아니라 파일명까지 포함해야 했다

string FilePath = "Assets/Resources" // (Error)
string FilePath = "Assets/Resources/hp.png"; // (Ok!)

File.WriteAllBytes() 자체가 원래있던 파일에 덮어씌우는 느낌이라서..!

그래서 저장하려는 폴더에 같은 이름의 파일을 아무거나 넣어놓고,
아래 코드를 테스트했더니 정상적으로 다운받아졌다


최종적으로는 폴더에 같은 이름의 파일을 넣어놓는 과정을 생략하기 위해
File.Create()로 같은 이름의 empty file을 먼저 생성해주었다

using System.IO;
using UnityEngine.Networking;

public class WebRequestTest : MonoBehaviour
{
    string FilePath = "Assets/Resources/hp.png";
    string createFilePath = "Assets/Resources/hp.png";
   
    void Start()
    {
        File.Create(createFilePath);
        StartCoroutine(DownLoadGet("{다운로드 링크}"));        
            public IEnumerator DownLoadGet(string URL)
    {
        UnityWebRequest request = UnityWebRequest.Get(URL);

        yield return request.SendWebRequest();
        // 에러 발생 시
        if(request.result == UnityWebRequest.Result.ConnectionError || request.result == UnityWebRequest.Result.ProtocolError)
        {
            Debug.Log(request.error);
        }
        else
        {
            File.WriteAllBytes(FilePath, request.downloadHandler.data); // 파일 다운로드
        }
    }

}

UnityWebRequest.Post(URL)

  • 유니티에서 JsonUtility를 지원해서 게임오브젝트도 Jsonfile로 만들어서 전송할 수 있다
  • Upload할 서버가 없어서 아직 테스트는 해보지 못했다
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Networking;

public class WebRequestPostTest : MonoBehaviour
{
    public GameObject postObj;
    // Start is called before the first frame update
    void Start()
    {
        string jsonfile = JsonUtility.ToJson(postObj);
        StartCoroutine(Upload("http://URL", jsonfile));
        
    }

    IEnumerator Upload(string URL, string jsonfile)
    {
        using (UnityWebRequest request = UnityWebRequest.Post(URL, jsonfile))
        {
            byte[] jsonToSend = new System.Text.UTF8Encoding().GetBytes(jsonfile);
            request.uploadHandler = new UploadHandlerRaw(jsonToSend);
            request.downloadHandler = (DownloadHandler)new DownloadHandlerBuffer();
            request.SetRequestHeader("Content-Type", "application/json");

            yield return request.SendWebRequest();
            if(request.result == UnityWebRequest.Result.ConnectionError || request.result == UnityWebRequest.Result.ProtocolError)
            {
                Debug.Log(request.error);
            }
            else
            {
                Debug.Log(request.downloadHandler.text);
            }
        }
    }
}

다음에는 서버 파서 올려보고 Json 파싱하는 거까지 해봐야겠다

참고

좋은 웹페이지 즐겨찾기