유니티 에서 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);
}
}
}
반응형
'IT > 공부 정리' 카테고리의 다른 글
[Unity] 복습: C#기본기 (0) | 2024.07.04 |
---|---|
[Unity] 유니티복습 생명주기 (0) | 2024.06.19 |
MQTT, MQTT Protocol란 (0) | 2023.06.16 |
[UNITY/C#] Catmull-Rom 스플라인을 사용하여 곡선 및 텍스처에 적용하기 (1) | 2023.03.19 |
캣멀-롬 스플라인(Catmull-Rom Splines) (0) | 2023.03.19 |