UniRx의 간단한 샘플 6 (가입 중지)
앞면(Buton을 누르면 움직이는 GameObjet)
다음(완료 알림)
구독 중지
다음 코드를 보십시오
DeadUpdateusing 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
가장 간단한 방법은 다음과 같은 코드다.
SafeAddTousing 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
그리고TakeUnitilDestroy
와TakeUntilDisable
.
SafeUpdateusing 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
가 폐기되면 누르지 않습니다.
그나저나 AddTo
는 Dispose()
에 불과하지만 TakeUntilDestroy
등은 OnCompleted
가 미루었다는 통지가 있었다.
가입 중지(수동)
실제로Subscribe
의 반환값은IDisposable
이다.
이것Dispose
이면 구독을 중지합니다.
따라서 수동으로 삭제된 코드는 이렇다.
SafeUpdateusing 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()
자체는 옵서버이기 때문에 삭제해도 문제가 없어 정상적으로 정지했다.
실행 결과
분명히 이미 완전히 사라졌지만, 잘못은 없다!
Reference
이 문제에 관하여(UniRx의 간단한 샘플 6 (가입 중지)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/Marimoiro/items/819ddb3e68aab7ee3b95
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
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
);
}
}
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);//これを消すと登録が解除できず例外
}
}
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));
}
}
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);
});
}
}
Reference
이 문제에 관하여(UniRx의 간단한 샘플 6 (가입 중지)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/Marimoiro/items/819ddb3e68aab7ee3b95텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)