이번에는 Texture2D DataModule을 만들어보겠습니다.
하나하나 차근차근 보도록하겠습니다!
Buffer때 했던 공통된 코드는 넘어가도록 하겠습니다.
Buffer를 못보신 분들을 위해 링크 첨부하겠습니다.
DataModule - Buffer
request 설정부터 하고 가야겠죠?
request는 UnityWebRequestTexture의 GetTexture 메소드를 활용하여
이미지를 다운로드하여 텍스처로 변환하도록 올바르게 구성된 Unity Web Request를 받습니다.
그리고 DownloadHandlerTexture형의 handlerTexture 변수에 앞서 정의한 request의 downloadhandler를 담아냅니다!
여기서! as를 활용하여 DownloadHandlerTexture로 담아냅니다!
UnityWebRequest request;
request = UnityWebRequestTexture.GetTexture(requestURL);
DownloadHandlerTexture handlerTexture = request.downloadHandler as DownloadHandlerTexture;
간단하게 Texture2D의 request부분을 볼까요?
앞서 정의된 handlerTexture의 texture를 받아서 return해주면 간단하게 끝납니다!
var res = await request.SendWebRequest().WithCancellation(cts.Token);
Texture2D result = handlerTexture.texture;
return result;
/// <summary>
/// Texture Webrequest.
/// Post일때는 받는 것이 default(return).
/// </summary>
/// <param name="url"></param>
/// <returns></returns>
public static async UniTask<Texture2D> WebrequestTextureGet(string url, NetworkType networkType)
{
//네트워크 체킹
await CheckNetwork();
//API URL 생성
string requestURL = DOMAIN + url;
//Timeout 설정
var cts = new CancellationTokenSource();
cts.CancelAfterSlim(TimeSpan.FromSeconds(timeout));
UnityWebRequest request;
request = UnityWebRequestTexture.GetTexture(requestURL);
DownloadHandlerTexture handlerTexture = request.downloadHandler as DownloadHandlerTexture;
//Header 정보 입력
if (REPLACE_BEARER_TOKEN == "" && PlayerPrefs.GetString("Bearer") != "")
{
REPLACE_BEARER_TOKEN = PlayerPrefs.GetString("Bearer");
}
SetHeaders(request, "Authorization", "Bearer " + REPLACE_BEARER_TOKEN);
SetHeaders(request, "Content-Type", "application/json");
try
{
var res = await request.SendWebRequest().WithCancellation(cts.Token);
Texture2D result = handlerTexture.texture;
return result;
}
catch (OperationCanceledException ex)
{
if (ex.CancellationToken == cts.Token)
{
Debug.Log("Timeout");
//TODO: 네트워크 재시도 팝업 호출.
//재시도
return await WebrequestTextureGet(url, networkType);
}
}
catch (Exception e)
{
Debug.Log(e.Message);
return default;
}
return default;
}
/// <summary>
/// Check Network
/// </summary>
/// <returns></returns>
private static async UniTask CheckNetwork()
{
if (Application.internetReachability == NetworkReachability.NotReachable)
{
Debug.LogError("The netwok is not connected");
await UniTask.WaitUntil(() => Application.internetReachability != NetworkReachability.NotReachable);
Debug.Log("The network is connected");
}
}
/// <summary>
/// Setting Header
/// </summary>
/// <param name="request"></param>
/// <param name="value1"></param>
/// <param name="value2"></param>
private static void SetHeaders(UnityWebRequest request, string value1, string value2)
{
request.SetRequestHeader(value1, value2);
}