
www
www 클래스는 유니티에서 제공하는 간단한 방법으로 웹 서버와 통신할 수 있게 해주는 클래스입니다. 웹 페이지의 데이터를 다운로드하거나, 이미지 등을 불러올 때 사용됩니다.
현재 www는 유니티에서 권장하지 않고 있습니다.
UnityWebRequest
UnityWebRequest 클래스는 유니티에서 HTTP 통신을 할 수 있게 해주는 클래스입니다. GET, POST 등 다양한 HTTP 요청 방식을 지원하며, 파일 다운로드, 업로드 등의 작업에 사용됩니다. 유니티에서 www를 사용하기 보다는 UnityWebRequest를 사용하는 것을 권장합니다.
IEnumerator GetTextData()
{
string url = "https://example.com/data.json";
UnityWebRequest request = UnityWebRequest.Get(url);
yield return request.SendWebRequest();
if (request.result == UnityWebRequest.Result.Success)
{
Debug.Log("받은 데이터: " + request.downloadHandler.text);
}
else
{
Debug.LogError("요청 실패: " + request.error);
}
}
// Json 다운로드 형식
UnityWebRequest request = UnityWebRequest.Get("https://example.com/data.json");
yield return request.SendWebRequest();
if (request.result == UnityWebRequest.Result.Success)
{
string jsonText = request.downloadHandler.text;
Debug.Log(jsonText);
}
// Texture2D 다운로드 형식
UnityWebRequest request = UnityWebRequestTexture.GetTexture("https://example.com/image.png");
yield return request.SendWebRequest();
if (request.result == UnityWebRequest.Result.Success)
{
Texture2D tex = DownloadHandlerTexture.GetContent(request);
myRenderer.material.mainTexture = tex;
}
// byte[] -> Texture2D 변환
IEnumerator GetTextureFromBytes()
{
UnityWebRequest request = UnityWebRequest.Get("https://example.com/image.png");
yield return request.SendWebRequest();
if (request.result == UnityWebRequest.Result.Success)
{
byte[] imageBytes = request.downloadHandler.data;
Texture2D texture = new Texture2D(2, 2); // 임의 크기, LoadImage가 자동 리사이즈함
texture.LoadImage(imageBytes); // PNG/JPG 포맷 해석
// 결과 사용
GetComponent<Renderer>().material.mainTexture = texture;
}
else
{
Debug.LogError(request.error);
}
}
// AudioClip 다운로드 형식
UnityWebRequest request = UnityWebRequestMultimedia.GetAudioClip("https://example.com/sound.mp3", AudioType.MPEG);
yield return request.SendWebRequest();
if (request.result == UnityWebRequest.Result.Success)
{
AudioClip clip = DownloadHandlerAudioClip.GetContent(request);
audioSource.clip = clip;
audioSource.Play();
}
// zip 파일 조회 후 압축 해제
// zip 압축 해제를 위해 ICSharpCode.SharpZipLib 설치 필요 (Nuget 통해 설치 가능)
using UnityEngine;
using UnityEngine.Networking;
using System.Collections;
using System.IO;
using ICSharpCode.SharpZipLib.Zip;
IEnumerator DownloadAndUnzip()
{
string zipUrl = "https://example.com/files/archive.zip";
string zipPath = Path.Combine(Application.persistentDataPath, "archive.zip");
string extractPath = Path.Combine(Application.persistentDataPath, "unzipped");
UnityWebRequest request = UnityWebRequest.Get(zipUrl);
request.downloadHandler = new DownloadHandlerFile(zipPath);
yield return request.SendWebRequest();
if (request.result == UnityWebRequest.Result.Success)
{
Debug.Log("ZIP 파일 다운로드 완료");
// 압축 해제
using (FileStream fs = File.OpenRead(zipPath))
using (ZipInputStream zipStream = new ZipInputStream(fs))
{
ZipEntry entry;
while ((entry = zipStream.GetNextEntry()) != null)
{
string filePath = Path.Combine(extractPath, entry.Name);
Directory.CreateDirectory(Path.GetDirectoryName(filePath));
using (FileStream streamWriter = File.Create(filePath))
{
byte[] buffer = new byte[4096];
int size;
while ((size = zipStream.Read(buffer, 0, buffer.Length)) > 0)
{
streamWriter.Write(buffer, 0, size);
}
}
Debug.Log($"파일 추출: {entry.Name}");
}
}
}
else
{
Debug.LogError("ZIP 다운로드 실패: " + request.error);
}
}
전송할 때 사용됩니다. 일반적으로 로그인, 업로드 등에 사용합니다.// 기초 소스 코드
IEnumerator PostJsonData()
{
string url = "https://example.com/upload";
string json = "{\"name\":\"chatgpt\",\"score\":100}";
UnityWebRequest request = new UnityWebRequest(url, "POST");
byte[] jsonToSend = new System.Text.UTF8Encoding().GetBytes(json);
request.uploadHandler = new UploadHandlerRaw(jsonToSend);
request.downloadHandler = new DownloadHandlerBuffer();
request.SetRequestHeader("Content-Type", "application/json");
yield return request.SendWebRequest();
if (request.result == UnityWebRequest.Result.Success)
{
Debug.Log("응답: " + request.downloadHandler.text);
}
else
{
Debug.LogError("요청 실패: " + request.error);
}
}
// 로컬에 있는 Json 파일 전송
IEnumerator PostLocalJsonFile()
{
string filePath = Path.Combine(Application.streamingAssetsPath, "myData.json");
string jsonData = File.ReadAllText(filePath);
UnityWebRequest request = new UnityWebRequest("https://example.com/upload", "POST");
byte[] bodyRaw = System.Text.Encoding.UTF8.GetBytes(jsonData);
request.uploadHandler = new UploadHandlerRaw(bodyRaw);
request.downloadHandler = new DownloadHandlerBuffer();
request.SetRequestHeader("Content-Type", "application/json");
yield return request.SendWebRequest();
if (request.result == UnityWebRequest.Result.Success)
{
Debug.Log("JSON 전송 완료: " + request.downloadHandler.text);
}
else
{
Debug.LogError("전송 실패: " + request.error);
}
}
// 로컬에 있는 zip 파일 전송
IEnumerator PostLocalZipFile()
{
string zipFilePath = Path.Combine(Application.persistentDataPath, "archive.zip");
byte[] zipBytes = File.ReadAllBytes(zipFilePath);
UnityWebRequest request = new UnityWebRequest("https://example.com/upload", "POST");
request.uploadHandler = new UploadHandlerRaw(zipBytes);
request.downloadHandler = new DownloadHandlerBuffer();
request.SetRequestHeader("Content-Type", "application/zip");
yield return request.SendWebRequest();
if (request.result == UnityWebRequest.Result.Success)
{
Debug.Log("ZIP 전송 완료: " + request.downloadHandler.text);
}
else
{
Debug.LogError("전송 실패: " + request.error);
}
}
// 텍스처(Texture 2D) 전송 (png 변환 후)
IEnumerator PostTexture(Texture2D texture)
{
byte[] pngData = texture.EncodeToPNG();
UnityWebRequest request = new UnityWebRequest("https://example.com/upload", "POST");
request.uploadHandler = new UploadHandlerRaw(pngData);
request.downloadHandler = new DownloadHandlerBuffer();
request.SetRequestHeader("Content-Type", "image/png");
yield return request.SendWebRequest();
if (request.result == UnityWebRequest.Result.Success)
{
Debug.Log("텍스처 전송 완료");
}
else
{
Debug.LogError("전송 실패: " + request.error);
}
}
// 비디오 또는 오디오 전송 (바이너리 그대로)
IEnumerator PostMediaFile(string mediaPath, string mimeType)
{
byte[] mediaBytes = File.ReadAllBytes(mediaPath);
UnityWebRequest request = new UnityWebRequest("https://example.com/upload", "POST");
request.uploadHandler = new UploadHandlerRaw(mediaBytes);
request.downloadHandler = new DownloadHandlerBuffer();
request.SetRequestHeader("Content-Type", mimeType); // 예: "video/mp4" 또는 "audio/mpeg"
yield return request.SendWebRequest();
if (request.result == UnityWebRequest.Result.Success)
{
Debug.Log("미디어 파일 전송 완료");
}
else
{
Debug.LogError("전송 실패: " + request.error);
}
}
// 사용 예시
StartCoroutine(PostMediaFile(Application.streamingAssetsPath + "/sample.mp4", "video/mp4"));
StartCoroutine(PostMediaFile(Application.streamingAssetsPath + "/sound.mp3", "audio/mpeg"));
UploadHandler
UnityWebRequest request = UnityWebRequest.Put("https://example.com/upload", "Assets/Data/file.txt");
request.uploadHandler = new UploadHandlerFile("Assets/Data/file.txt");
yield return request.SendWebRequest();
List<IMultipartFormSection> formData = new List<IMultipartFormSection>();
formData.Add(new MultipartFormDataSection("field1", "value1"));
formData.Add(new MultipartFormDataSection("field2", "value2"));
UnityWebRequest request = UnityWebRequest.Post("https://example.com/form", formData);
yield return request.SendWebRequest();
DownloadHandler
string savePath = Application.persistentDataPath + "/file.json";
UnityWebRequest request = UnityWebRequest.Get("https://example.com/data.json");
request.downloadHandler = new DownloadHandlerFile(savePath);
yield return request.SendWebRequest();
string url = "https://example.com/bundle";
UnityWebRequest request = UnityWebRequestAssetBundle.GetAssetBundle(url);
yield return request.SendWebRequest();
if (request.result == UnityWebRequest.Result.Success)
{
AssetBundle bundle = DownloadHandlerAssetBundle.GetContent(request);
GameObject prefab = bundle.LoadAsset<GameObject>("MyPrefab");
Instantiate(prefab);
}
📘 UnityWebRequest의 작업 흐름
UnityWebRequest.Get/Post/Put/...)uploadHandler, downloadHandler 지정SendWebRequest)result, downloadHandler.text 또는 GetContent() 등으로 결과 확인