Unity 2018.3 이상의 ObservableWWW 대안

11424 단어 UniRxUniTaskUnity

ObservableWWW

ObservableWWW는 UniRx에서 UnityEngine.WWWObservable 로 처리하는 편리한 기구입니다.
그러나 이것UnityEngine.WWW은 그 자체가 상당히 오래되어 2019년이 되면 지금은 추천하지 않는다.UnityWebRequest로 대체해야 함
이와 함께 유니티 2018.3 이후ObservableWWWObsolete로 바뀌었다.

따라서 이번에는 유니티 2018.3 이후ObservableWWW의 대체 수단을 소개한다.

원래 Unity 2018.3 이후에는 Observable WWW를 안 써도 돼요?


결국 유니티 2018.3의 경우 유니태스크를 사용할 수 있기 때문에 적극적으로 활용할 필요가 없다Observable.
이런 일회 비동기 처리async/await만으로도 충분하기 때문이다.

결론: UniTask 사용


따라서 결론은 "UniTask 사용"입니다.

GitHub에서 UniTask 배포


AssetStore에서 UniTask를 공개하지 않으므로 GitHub부터 배포해야 합니다.
  • UniTask Release Page
  • 위의 위치에서 최신 UniTask unitypackage를 다운로드하여 Unity 프로젝트에 배치하십시오.
    'UniTask'라는 프로젝트명이지만 역사적인 이유로 소프트웨어 패키지의 이름은'UniRx. Async'입니다.

    UniTask를 사용하여 코드 작성

    using UniRx.Async; 이후.WWW 대신 UnityWebRequest 대기async/await를 사용하십시오.
    using System;
    using UnityEngine;
    using UniRx.Async;
    using UnityEngine.Networking;
    
    public class UnityWebRequestSample : MonoBehaviour
    {
        async void Start()
        {
            var uri = "https://unity.com/";
            try
            {
                var result = await GetTextAsync(uri);
                Debug.Log(result);
            }
            catch (Exception e)
            {
                Debug.LogException(e);
            }
        }
    
    
        /// <summary>
        /// UnityWebRequestをasync/awaitで待ち受ける
        /// </summary>
        private async UniTask<string> GetTextAsync(string uri)
        {
            var uwr = UnityWebRequest.Get(uri);
    
            // SendWebRequestが終わるまでawait 
            await uwr.SendWebRequest();
    
            if (uwr.isHttpError || uwr.isNetworkError)
            {
                // 失敗していたらそのまま例外をthrow
                throw new Exception(uwr.error);
            }
    
            return uwr.downloadHandler.text;
        }
    }
    
    이렇게 하면 돼.

    그래도 Observable이 좋아요.


    여러 가지 상황에 따라 UniTask<T> 가 아닌 IObservable<T> 로 전환하고 싶을 때가 있다.
    이 경우 ToObservable() 로 전환하는 것이 좋다.

    핫을 유지할 수 있다면.


    실행GetTextureObservable()GetTextAsync() 을 시작할 수 있다면 이 방법을 사용하면 된다.
    /// <summary>
    /// UnityWebRequestを内部で利用したObservable
    /// </summary>
    /// <param name="uri"></param>
    /// <returns></returns>
    private IObservable<string> GetTextureObservable(string uri)
    {
        return GetTextAsync(uri).ToObservable();
    }
    
    /// <summary>
    /// UnityWebRequestをasync/awaitで待ち受ける
    /// </summary>
    private async UniTask<string> GetTextAsync(string uri)
    {
        var uwr = UnityWebRequest.Get(uri);
    
        // SendWebRequestが終わるまでawait 
        await uwr.SendWebRequest();
    
        if (uwr.isHttpError || uwr.isNetworkError)
        {
            // 失敗していたらそのまま例外をthrow
            throw new Exception(uwr.error);
        }
    
        return uwr.downloadHandler.text;
    }
    

    하면, 만약, 만약...

    GetTextureObservable()Subscribe()의 정시에 GetTextAsync()부터 실행하기를 원한다면 이 방법을 사용합니다.
    사용하십시오Observable.Defer().
    /// <summary>
    /// UnityWebRequestを内部で利用したObservable
    /// </summary>
    /// <param name="uri"></param>
    /// <returns></returns>
    private IObservable<string> GetTextureObservable(string uri)
    {
        return Observable.Defer(() => GetTextAsync(uri).ToObservable());
    }
    
    /// <summary>
    /// UnityWebRequestをasync/awaitで待ち受ける
    /// </summary>
    private async UniTask<string> GetTextAsync(string uri)
    {
        var uwr = UnityWebRequest.Get(uri);
    
        // SendWebRequestが終わるまでawait 
        await uwr.SendWebRequest();
    
        if (uwr.isHttpError || uwr.isNetworkError)
        {
            // 失敗していたらそのまま例外をthrow
            throw new Exception(uwr.error);
        }
    
        return uwr.downloadHandler.text;
    }
    

    총결산

  • UnityWebRequest를 사용하는 경우 UniTask 및 async/await
  • Observable가 되려면 UniTask에서 변환
  • 또 이대로는 CancellationToken 을 자변량으로 설정한 경우ToObservable 진행할 수 없다.
    그러니까 이쪽 기사를 보세요.
  • UniTask를 CancellationToken으로 지정하는 동시에 ToObservable 주석을 사용할 수 있습니다.
  • 좋은 웹페이지 즐겨찾기