IT/공부 정리

[Unity] HTTP 통신

rinix_x 2023. 6. 16. 11:08

유니티 에서 JSON, image등을 주고 받기 위해 HTTP 통신을 써봤다.

JSON과 같은 텍스트형은 아래와 같은 코드다

 

void LoadSeverJson(string fileName)
    {
        if (false == File.Exists(Pth + fileName + ".json"))
        {
            Debug.Log("파일이 없습니다.");
            return;
        }
        string data_Jsonfile = File.ReadAllText(Pth + fileName + ".json");

        StartCoroutine(ServerGetJsonToUnity(fileName, (www) =>
        {
            data_Jsonfile = www.downloadHandler.text;
        }));
        
    }
IEnumerator ServerGetJsonToUnity(string fileName, Action<UnityWebRequest> callback)
    {
        //string url = "http://~~~/test0526.json";
        string url = Path.Combine("http://~~~/" + fileName);

        UnityWebRequest www = UnityWebRequest.Get(url);

        yield return www.SendWebRequest();
        Debug.Log(1);

        if (www.result != UnityWebRequest.Result.Success)
        {
            Debug.Log(www.error);
        }
        else
        {
            callback(www);
            Debug.Log(www.downloadHandler.text);
            Debug.Log("Get request complete!");
        }

    }

 

 

이미지

//서버에서 이미지 갖고오기
    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
        {
            // 이미지 넣어줌
            texture = new Texture2D(0, 0);
            texture.LoadImage(request_.downloadHandler.data);
            //Debug.Log(Path.GetFileName(OpenDialog.FileName));
            obj_test_img.GetComponent<RawImage>().texture = texture;

        }
    }

 

에셋번들도 비슷 한 방식이다.

서버에서 다운받고 내부에서 불러주는 방식을 사용하여 WebGL에서도 가능하다.

IEnumerator SaveAssetBundleOnDisk(string AssetBundleName, string DiskOnAssetBundleName)
    {

        // 에셋 번들을 받아오고자하는 서버의 주소

        // 지금은 주소와 에셋 번들 이름을 함께 묶어 두었지만

        // 주소 + 에셋 번들 이름 형태를 띄는 것이 좋다.
        string uri = BasicUrl + AssetBundleName;
        Debug.Log(BasicUrl);


        // 웹 서버에 요청을 생성한다.
        UnityWebRequest request = UnityWebRequest.Get(uri);
        yield return request.Send();



        // 에셋 번들을 저장할 경로

        string assetBundleDirectory = "Assets/AssetBundleObj";
        // 에셋 번들을 저장할 경로의 폴더가 존재하지 않는다면 생성시킨다.
        if (!Directory.Exists(assetBundleDirectory))
        {
            Directory.CreateDirectory(assetBundleDirectory);
        }



        // 파일 입출력을 통해 받아온 에셋을 저장하는 과정
        FileStream fs = new FileStream(assetBundleDirectory + "/" + DiskOnAssetBundleName, System.IO.FileMode.Create);
        fs.Write(request.downloadHandler.data, 0, (int)request.downloadedBytes);
        fs.Close();
        Debug.Log("Completly");
    }
 IEnumerator LoadAssetFromLocalDisk(string DiskOnAssetBundleName, string AssetBundleObjName, bool check_Dep)
    {
        string assetBundleDirectory = "Assets/AssetBundleObj";
        // 저장한 에셋 번들로부터 에셋 불러오기
        var myLoadedAssetBundle = AssetBundle.LoadFromFile(Path.Combine(assetBundleDirectory + "/", DiskOnAssetBundleName));
        if (myLoadedAssetBundle == null)
        {
            Debug.Log("Failed to load AssetBundle!");
            yield break;
        }
        else
            Debug.Log("Successed to load AssetBundle!");
        if (check_Dep)
        {
            var prefab = myLoadedAssetBundle.LoadAsset<GameObject>(AssetBundleObjName);
            Instantiate(prefab, Vector3.zero, Quaternion.identity);

        }
        myLoadedAssetBundle.Unload(false);  //연결 끊어줌으로써 데이터효율?
    }

 

using System.IO;
using System.Collections;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Networking;

public class AssetLoader : MonoBehaviour
{
    public static AssetLoader instance = null;
    private void Awake()
    {
        if (instance == null)
        {
            instance = this;
            DontDestroyOnLoad(this.gameObject);
        }
        else if (instance != this)
        {
            Destroy(this.gameObject);
        }
    }
    //string BasicUrl = "http://192.168.0.55:81/dw/testAssetBundle/";
    string BasicUrl = "http://192.168.0.55:81/MapTest/WinVer/";

    string AssetBundleName_ = "mapfileimage";
    string SaveAssetBundleName_ = "mapfileimage";
    string AssetBundleObjName_ = "UijeongbuB1F";

    public RawImage viewimage;


    private void Start()
    {
#if UNITY_WEBGL
        //BasicUrl = "http://192.168.0.55:81/dw/testAssetBundle/webVer/";
        BasicUrl = "http://192.168.0.55:81/MapTest/WebVer/";
#else
        //BasicUrl = "http://192.168.0.55:81/dw/testAssetBundle/winVer1/";
        BasicUrl = "http://192.168.0.55:81/MapTest/WinVer/";
#endif

        //StartSave();
        //GetAssetBundleInfo();
    }

    public void StartSave()
    {
        //StartCoroutine(SaveAssetBundleOnDisk("icon-resources-view", "icon-resources-view"));

        StartCoroutine(SaveAssetBundleOnDisk(AssetBundleName_, SaveAssetBundleName_));
    }
    public void Load()
    {
        //StartCoroutine(LoadAssetFromLocalDisk("icon-resources-view", "icon-resources-view", false));
        StartCoroutine(LoadAssetFromLocalDisk(SaveAssetBundleName_, AssetBundleObjName_, true));

        //StartCoroutine(LoadImageAssetFromLocalDisk("icon-resources-view", "restaurant"));
        // StartCoroutine(LoadImageAssetFromLocalDisk(SaveAssetBundleName_, AssetBundleObjName_, (prefab_) =>
        // {
        //     viewimage.GetComponent<Image>().sprite = prefab_;
        // }));
    }

    public RawImage ImageLoad(string AssetBundleName, string DiskOnAssetBundleName, string AssetBundleObjName)
    {
        StartCoroutine(SaveAssetBundleOnDisk(AssetBundleName, DiskOnAssetBundleName));
        //StartCoroutine(LoadImageAssetFromLocalDisk(DiskOnAssetBundleName, AssetBundleObjName));
        StartCoroutine(LoadImageAssetFromLocalDiskCall(DiskOnAssetBundleName, AssetBundleObjName, (prefab_) =>
        {
            viewimage.GetComponent<RawImage>().texture = prefab_;
        }));
        return viewimage;
    }

    // 서버에서 받아오고자 하는 에셋 번들의 이름 목록

    // 지금은 간단한 배열 형태를 사용하고 있지만 이후에는

    // xml이나 json을 사용하여 현재 가지고 있는 에셋 번들의 버전을 함께 넣어주고

    // 서버의 에셋 번들 버전 정보를 비교해서 받아오는 것이 좋다.
    public string[] assetBundleNames;

    IEnumerator SaveAssetBundleOnDisk(string AssetBundleName, string DiskOnAssetBundleName)
    {

        // 에셋 번들을 받아오고자하는 서버의 주소

        // 지금은 주소와 에셋 번들 이름을 함께 묶어 두었지만

        // 주소 + 에셋 번들 이름 형태를 띄는 것이 좋다.
        string uri = BasicUrl + AssetBundleName;
        Debug.Log(BasicUrl);


        // 웹 서버에 요청을 생성한다.
        UnityWebRequest request = UnityWebRequest.Get(uri);
        yield return request.Send();



        // 에셋 번들을 저장할 경로

        string assetBundleDirectory = "Assets/AssetBundleObj";
        // 에셋 번들을 저장할 경로의 폴더가 존재하지 않는다면 생성시킨다.
        if (!Directory.Exists(assetBundleDirectory))
        {
            Directory.CreateDirectory(assetBundleDirectory);
        }



        // 파일 입출력을 통해 받아온 에셋을 저장하는 과정
        FileStream fs = new FileStream(assetBundleDirectory + "/" + DiskOnAssetBundleName, System.IO.FileMode.Create);
        fs.Write(request.downloadHandler.data, 0, (int)request.downloadedBytes);
        fs.Close();
        Debug.Log("Completly");
    }

    IEnumerator LoadAssetFromLocalDisk(string DiskOnAssetBundleName, string AssetBundleObjName, bool check_Dep)
    {
        string assetBundleDirectory = "Assets/AssetBundleObj";
        // 저장한 에셋 번들로부터 에셋 불러오기
        var myLoadedAssetBundle = AssetBundle.LoadFromFile(Path.Combine(assetBundleDirectory + "/", DiskOnAssetBundleName));
        if (myLoadedAssetBundle == null)
        {
            Debug.Log("Failed to load AssetBundle!");
            yield break;
        }
        else
            Debug.Log("Successed to load AssetBundle!");
        if (check_Dep)
        {
            var prefab = myLoadedAssetBundle.LoadAsset<GameObject>(AssetBundleObjName);
            Instantiate(prefab, Vector3.zero, Quaternion.identity);

        }
        myLoadedAssetBundle.Unload(false);
    }
    IEnumerator LoadImageAssetFromLocalDisk(string DiskOnAssetBundleName, string AssetBundleObjName)
    {
        string assetBundleDirectory = "Assets/AssetBundleObj";
        Debug.Log(Path.Combine(assetBundleDirectory + "/", DiskOnAssetBundleName));
        // 저장한 에셋 번들로부터 에셋 불러오기
        var myLoadedAssetBundle = AssetBundle.LoadFromFile(Path.Combine(assetBundleDirectory + "/", DiskOnAssetBundleName));
        if (myLoadedAssetBundle == null)
        {
            Debug.Log("Failed to load AssetBundle!");
            yield break;
        }
        else
            Debug.Log("Successed to load AssetBundle!");


        var prefab = myLoadedAssetBundle.LoadAsset<Texture2D>(AssetBundleObjName);
        viewimage.GetComponent<RawImage>().texture = prefab;

        //Instantiate(prefab, Vector3.zero, Quaternion.identity); 
    }


    IEnumerator LoadImageAssetFromLocalDiskCall(string DiskOnAssetBundleName, string AssetBundleObjName, System.Action<Texture2D> callback)
    {
        string assetBundleDirectory = "Assets/AssetBundleObj";
        // 저장한 에셋 번들로부터 에셋 불러오기
        var myLoadedAssetBundle = AssetBundle.LoadFromFile(Path.Combine(assetBundleDirectory + "/", DiskOnAssetBundleName));
        if (myLoadedAssetBundle == null)
        {
            Debug.Log("Failed to load AssetBundle!");
            yield break;
        }
        else
            Debug.Log("Successed to load AssetBundle!");

        var prefab = myLoadedAssetBundle.LoadAsset<Texture2D>(AssetBundleObjName);
        Debug.Log(prefab);
        if (prefab != null)
            callback(prefab);
        //Instantiate(prefab, Vector3.zero, Quaternion.identity); 
    }

    public void GetAssetBundleInfo()//string bundleName_)
    {
        StartCoroutine(GetAssetBundleManifest());
    }


    //manigest를 통해 종속성 확인
    IEnumerator GetAssetBundleManifest()
    {
        string AssetBundleName = "WinVer";
        string DiskOnAssetBundleName = "WinVer";
        // 에셋 번들을 받아오고자하는 서버의 주소

        // 지금은 주소와 에셋 번들 이름을 함께 묶어 두었지만

        // 주소 + 에셋 번들 이름 형태를 띄는 것이 좋다.
        string uri = BasicUrl + AssetBundleName;
        Debug.Log(BasicUrl);


        // 웹 서버에 요청을 생성한다.
        UnityWebRequest request = UnityWebRequest.Get(uri);
        yield return request.Send();



        // 에셋 번들을 저장할 경로

        string assetBundleDirectory = "Assets/AssetBundleObj";
        // 에셋 번들을 저장할 경로의 폴더가 존재하지 않는다면 생성시킨다.
        if (!Directory.Exists(assetBundleDirectory))
        {
            Directory.CreateDirectory(assetBundleDirectory);
        }



        // 파일 입출력을 통해 받아온 에셋을 저장하는 과정
        FileStream fs = new FileStream(assetBundleDirectory + "/" + DiskOnAssetBundleName, System.IO.FileMode.Create);
        fs.Write(request.downloadHandler.data, 0, (int)request.downloadedBytes);
        fs.Close();



        /////////////
        //string assetBundleDirectory = "Assets/AssetBundleObj";
        // 저장한 에셋 번들로부터 에셋 불러오기
        var myLoadedAssetBundle = AssetBundle.LoadFromFile(Path.Combine(assetBundleDirectory + "/", DiskOnAssetBundleName));
        if (myLoadedAssetBundle == null)
        {
            Debug.Log("Failed to load AssetBundle!");
            yield break;
        }
        else
            Debug.Log("Successed to load AssetBundle!");

        AssetBundleManifest prefab = myLoadedAssetBundle.LoadAsset<AssetBundleManifest>("AssetBundleManifest");

        foreach (var i in prefab.GetAllAssetBundles())
        {
            Debug.Log("test : " + i);
        }
    }


    //여러개의 이미지들을 불러오는 테스트 함수
    IEnumerator GetAssetBundlesImage()
    {
        string AssetBundleName = "mapfileimage";
        string DiskOnAssetBundleName = "mapfileimage";
        // 에셋 번들을 받아오고자하는 서버의 주소

        // 지금은 주소와 에셋 번들 이름을 함께 묶어 두었지만

        // 주소 + 에셋 번들 이름 형태를 띄는 것이 좋다.
        string uri = BasicUrl + AssetBundleName;
        Debug.Log(BasicUrl);


        // 웹 서버에 요청을 생성한다.
        UnityWebRequest request = UnityWebRequest.Get(uri);
        yield return request.Send();



        // 에셋 번들을 저장할 경로

        string assetBundleDirectory = "Assets/AssetBundleObj";
        // 에셋 번들을 저장할 경로의 폴더가 존재하지 않는다면 생성시킨다.
        if (!Directory.Exists(assetBundleDirectory))
        {
            Directory.CreateDirectory(assetBundleDirectory);
        }



        // 파일 입출력을 통해 받아온 에셋을 저장하는 과정
        FileStream fs = new FileStream(assetBundleDirectory + "/" + DiskOnAssetBundleName, System.IO.FileMode.Create);
        fs.Write(request.downloadHandler.data, 0, (int)request.downloadedBytes);
        fs.Close();



        /////////////
        //string assetBundleDirectory = "Assets/AssetBundleObj";
        // 저장한 에셋 번들로부터 에셋 불러오기
        var myLoadedAssetBundle = AssetBundle.LoadFromFile(Path.Combine(assetBundleDirectory + "/", DiskOnAssetBundleName));
        if (myLoadedAssetBundle == null)
        {
            Debug.Log("Failed to load AssetBundle!");
            yield break;
        }
        else
            Debug.Log("Successed to load AssetBundle!");

        var prefab = myLoadedAssetBundle.LoadAllAssets();
        foreach (var i in prefab)
        {
            Debug.Log("test : " + i.name);
        }
    }
}

 

 

 

 

 

반응형