UniRx의 간단한 샘플 6 (가입 중지)

14278 단어 UniRxUnityC#
UniRx의 간단한 샘플 사용 설명서
앞면(Buton을 누르면 움직이는 GameObjet)
다음(완료 알림)

구독 중지


다음 코드를 보십시오
DeadUpdate
using UnityEngine;
using System.Collections;
using UniRx;
using System;

public class DeadUpdate : Base {

    // Use this for initialization
    void Start () {

        gameObject.transform.position = new Vector2(0, 1f);

        //5秒後にgameObjectが死ぬ
        Observable.Timer(TimeSpan.FromSeconds(5))
           .Subscribe(_ => Destroy(gameObject));

        //0.5秒ごとに0.05右に移動
        Observable.Interval(TimeSpan.FromMilliseconds(500))
            .Subscribe(l => Move(0.5f, 0));
    }

    private void Move(float x, float y)
    {
        gameObject.transform.position = new Vector2(
            gameObject.transform.position.x + x, 
            gameObject.transform.position.y + y
        );
    }
}

이 코드는 5초 후gameObject 폐기될 때까지 0.5초마다 오른쪽으로 계속 이동하는 코드다.
그러나 이 코드는 5초 후gameObject에 찢어지면서 예외를 토해낸다.Observable.Interval(TimeSpan time)는 각time의 지속적인 수치에 따른 등록 목표이다.Observable.Timer(TimeSpan time)time 이후 한 번만 수치로 로그인한 곳이다.
자세한 내용은 UniRx의 간단한 견본 9(Timer 및 Interval 일정 시간 후 실행)를 참조하십시오.
이런 느낌이에요.

이게 뭐가 안 좋다면Observable.Interval(TimeSpan.FromMilliseconds(500)).Subscribe(l => Move(0.5f, 0)); 진행된 등록은 게임Object가 폐기된 후에도 살아있다Move로 불려왔죠.
이것Subscribe이 진행한 등록 해제(구독 정지라고 함)가 반드시 해야 할 일이다.
그래서 나는 이 문제를 해결할 것이다.

차리다


상당히 간단하게 하나만 붙인다SafeUpdate.

AddTo


가장 간단한 방법은 다음과 같은 코드다.
SafeAddTo
using UnityEngine;
using System.Collections;
using UniRx;
using System;

public class SafeUpdate : Base
{

    // Use this for initialization
    void Start () {

        gameObject.transform.position = new Vector2(0, 1f);

        //5秒後にgameObjectが死ぬ
        Observable.Timer(TimeSpan.FromSeconds(5))
            .Subscribe(_ => Destroy(gameObject));

        //0.5秒ごとに0.05右に移動
        Observable.Interval(TimeSpan.FromMilliseconds(500))
            .Subscribe(l => Move(0.1f, 0))
            .AddTo(this);//これを消すと登録が解除できず例外
    }
}

이렇게 Subscribe 이후.AddTo(Component c); c 폐기되면 같이 구독을 중지합니다.
이것은 가장 간단한 방법이다.

TakeUntilDestroy


그리고TakeUnitilDestroyTakeUntilDisable.
SafeUpdate
using UnityEngine;
using System.Collections;
using UniRx;
using System;

public class SafeUpdate : Base
{

    // Use this for initialization
    void Start () {

        gameObject.transform.position = new Vector2(0, 1f);

        //5秒後にgameObjectが死ぬ
        Observable.Timer(TimeSpan.FromSeconds(5))
            .Subscribe(_ => Destroy(gameObject));

        //0.5秒ごとに0.05右に移動
        Observable.Interval(TimeSpan.FromMilliseconds(500))
            .TakeUntilDestroy(this)//これを消すと例外
            .Subscribe(l => Move(0.1f, 0));
    }
}
TakeUntilDestroy(this) this가 폐기되면 누르지 않습니다.
그나저나 AddToDispose()에 불과하지만 TakeUntilDestroy 등은 OnCompleted가 미루었다는 통지가 있었다.

가입 중지(수동)


실제로Subscribe의 반환값은IDisposable이다.
이것Dispose이면 구독을 중지합니다.
따라서 수동으로 삭제된 코드는 이렇다.
SafeUpdate
using UnityEngine;
using System.Collections;
using UniRx;
using System;

public class SafeUpdate : Base
{

    // Use this for initialization
    void Start () {

        gameObject.transform.position = new Vector2(0, 1f);

        IDisposable mover =  Observable.Interval(TimeSpan.FromMilliseconds(500))
            .TakeUntilDestroy(this)
            .Subscribe(l => Move(0.1f, 0));

        //5秒後にgameObjectが死ぬ
        Observable.Timer(TimeSpan.FromSeconds(5)).Subscribe(_ => 
        {
            mover.Dispose();//moverを破棄して購読停止
            Destroy(gameObject);
        });
    }
}


삭제될 수 있는 gameObject를 처리할 때는 등록 주소나 자신의 수명을 고려하는 것이 좋다.
기본AddTo이면 될 것 같아요.
지금까지의 샘플this.UpdateAsObservable() 자체는 옵서버이기 때문에 삭제해도 문제가 없어 정상적으로 정지했다.

실행 결과


분명히 이미 완전히 사라졌지만, 잘못은 없다!

좋은 웹페이지 즐겨찾기