Unity 매뉴얼: DownloadHandler 개요
이 문서는 Unity의 DownloadHandler에 대한 안내서입니다. DownloadHandler는 UnityWebRequest와 함께 사용되어 데이터를 다운로드할 때 유용하게 활용됩니다. 이 문서에서는 다양한 DownloadHandler 유형과 그 사용 사례에 대해 설명합니다.
DownloadHandler 유형
다양한 DownloadHandler 유형이 있으며, 각각의 사용 용도에 따라 차별화됩니다.
DownloadHandler 유형 | 설명 |
---|---|
DownloadHandlerBuffer | 단순한 데이터 스토리지용으로 사용되며, 수신한 데이터를 네이티브 코드의 버퍼에 저장합니다. |
DownloadHandlerFile | 메모리를 적게 사용하면서 파일을 다운로드하고 디스크에 저장하는 데 사용됩니다. |
DownloadHandlerTexture | 이미지를 다운로드하여 UnityEngine.Texture로 변환하는 데 사용됩니다. |
DownloadHandlerAssetBundle | 에셋 번들을 가져오는 데 최적화되어 있으며, 스트리밍 다운로드가 가능합니다. |
DownloadHandlerAudioClip | 오디오 파일을 다운로드하여 AudioClip으로 변환하는 데 사용됩니다. |
DownloadHandlerMovieTexture | 비디오 파일을 다운로드했지만, 이제는 VideoPlayer 사용이 권장됩니다. |
DownloadHandlerScript | 커스터마이징이 필요한 경우 사용자가 정의한 클래스에 의해 상속될 수 있도록 합니다. |
사용 예제
각 DownloadHandler의 사용 예제는 다음과 같습니다:
1. DownloadHandlerBuffer
using UnityEngine;
using UnityEngine.Networking;
using System.Collections;
public class MyBehaviour : MonoBehaviour {
void Start() {
StartCoroutine(GetText());
}
IEnumerator GetText() {
UnityWebRequest www = new UnityWebRequest("https://www.my-server.com");
www.downloadHandler = new DownloadHandlerBuffer();
yield return www.SendWebRequest();
if (www.result != UnityWebRequest.Result.Success) {
Debug.Log(www.error);
}
else {
Debug.Log(www.downloadHandler.text);
}
}
}
2. DownloadHandlerFile
using System.Collections;
using System.IO;
using UnityEngine;
using UnityEngine.Networking;
public class FileDownloader : MonoBehaviour {
void Start () {
StartCoroutine(DownloadFile());
}
IEnumerator DownloadFile() {
var uwr = new UnityWebRequest("https://unity3d.com/");
string path = Path.Combine(Application.persistentDataPath, "unity3d.html");
uwr.downloadHandler = new DownloadHandlerFile(path);
yield return uwr.SendWebRequest();
if (uwr.result != UnityWebRequest.Result.Success) {
Debug.LogError(uwr.error);
}
else {
Debug.Log("File successfully downloaded and saved to " + path);
}
}
}
3. DownloadHandlerTexture
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Networking;
using System.Collections;
[RequireComponent(typeof(Image))]
public class ImageDownloader : MonoBehaviour {
Image _img;
void Start () {
_img = GetComponent<Image>();
Download("https://www.mysite.com/myimage.png");
}
public void Download(string url) {
StartCoroutine(LoadFromWeb(url));
}
IEnumerator LoadFromWeb(string url) {
UnityWebRequest wr = new UnityWebRequest(url);
DownloadHandlerTexture texDl = new DownloadHandlerTexture(true);
wr.downloadHandler = texDl;
yield return wr.SendWebRequest();
if (wr.result == UnityWebRequest.Result.Success) {
Texture2D t = texDl.texture;
Sprite s = Sprite.Create(t, new Rect(0, 0, t.width, t.height), Vector2.zero, 1f);
_img.sprite = s;
}
}
}
4. DownloadHandlerAssetBundle
using UnityEngine;
using UnityEngine.Networking;
using System.Collections;
public class MyBehaviour : MonoBehaviour {
void Start() {
StartCoroutine(GetAssetBundle());
}
IEnumerator GetAssetBundle() {
UnityWebRequest www = new UnityWebRequest("https://www.my-server.com");
DownloadHandlerAssetBundle handler = new DownloadHandlerAssetBundle(www.url, uint.MaxValue);
www.downloadHandler = handler;
yield return www.SendWebRequest();
if (www.result != UnityWebRequest.Result.Success) {
Debug.Log(www.error);
}
else {
AssetBundle bundle = handler.assetBundle;
}
}
}
5. DownloadHandlerAudioClip
using System.Collections;
using UnityEngine;
using UnityEngine.Networking;
public class AudioDownloader : MonoBehaviour {
void Start () {
StartCoroutine(GetAudioClip());
}
IEnumerator GetAudioClip() {
using (var uwr = UnityWebRequestMultimedia.GetAudioClip("https://myserver.com/mysound.ogg", AudioType.OGGVORBIS)) {
yield return uwr.SendWebRequest();
if (uwr.result != UnityWebRequest.Result.Success) {
Debug.LogError(uwr.error);
} else {
AudioClip clip = DownloadHandlerAudioClip.GetContent(uwr);
// use audio clip
}
}
}
}
6. DownloadHandlerScript
using UnityEngine;
using UnityEngine.Networking;
public class LoggingDownloadHandler : DownloadHandlerScript {
public LoggingDownloadHandler(): base() { }
public LoggingDownloadHandler(byte[] buffer): base(buffer) { }
protected override byte[] GetData() { return null; }
protected override bool ReceiveData(byte[] data, int dataLength) {
||
|---|
Debug.Log("LoggingDownloadHandler :: ReceiveData - received a null/empty buffer");
return false;
}
Debug.Log(string.Format("LoggingDownloadHandler :: ReceiveData - received {0} bytes", dataLength));
return true;
}
protected override void CompleteContent() {
Debug.Log("LoggingDownloadHandler :: CompleteContent - DOWNLOAD COMPLETE!");
}
protected override void ReceiveContentLengthHeader(ulong contentLength) {
Debug.Log(string.Format("LoggingDownloadHandler :: ReceiveContentLength - length {0}", contentLength));
}
}
결론
Unity의 DownloadHandler는 다양한 데이터를 다운로드하고 처리하는 데 유용한 클래스입니다. 각 DownloadHandler는 특정 용도를 위해 설계 되었으며, 상황에 맞는 적절한 Handler를 선택하여 사용하는 것이 중요합니다. 본 문서를 통해 DownloadHandler의 기본적인 사용 방법에 대해 이해할 수 있기를 바랍니다.