FC2ブログ
    02 «1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.» 04

    ハルシオンシステムの気ままBlog

    株式会社ハルシオンシステムのメンバーが送る、UnityやらJavaやらの技術的話題から、自社開発のアプリの宣伝とかとかのブログです。ほんと気ままにいきたいと思います。更新日は毎週 月 木でっす!

     

    【ハルシオンブログ】UniRxのReactivePropertyのSubscribeが意図せずに複数回動いてしまった件。え?基本だって? 

    こんにちは!
    3月に入りました!もう1年の1/6が終わってしまいましたね・・・・坂内っす。


    ポケットガール~受け継がれし希望~よろしくお願いします。
    URL(Android):https://play.google.com/store/apps/details?id=com.halcyon.pocketgirl3
    URL(iOS):https://itunes.apple.com/jp/app/id1539553611

    PV:



    UniRxで、こんな感じでReactivePropertyをしようして処理を書いていたんだけど、変な結果になってしまった。


    using UnityEngine;
    using UniRx;

    public class Blog20240304 : MonoBehaviour
    {
    ReactiveProperty<int> hp = new ReactiveProperty<int>(100);

    private void Start() {
    hp.Subscribe((val) => {
    if (val <= 0) {
    // 死んだ処理
    Debug.Log("しんだよ");
    }
    Debug.Log(val);
    });

    CalcDamage(200);
    }

    void CalcDamage(int damage) {
    hp.Value = Mathf.Clamp(hp.Value -= damage, 0, 1000);
    }
    }



    CalcDamageでダメージを受けて、hpのサブスクライブでHPが0以下になったら死んだ処理をおこなっている。

    これを動かすと、こんな結果になります。



    2回「しんだよ」の処理が流れてしまう。

    Clampの中でhp.Value += をやっているのが原因でした。
    ここでhpに入れ込んでいるため、Subscribeが動いてしまってます。

    CalcDamageを以下に修正することで対応できました。


    void CalcDamage(int damage) {
    hp.Value = Mathf.Clamp(hp.Value - damage, 0, 1000);
    }



    無駄にReactivePropertyを変更するとSubscribeが動いてしまうのがちょっと気を付けないといけないですね。

    え?こんなことやるやついないって?
    俺もそう思いますが、ちょっとこんなコードを見つけてしまったので注意ってことですね。


    そんなことでReactivePropertyのSubscribeが意図せずに複数回動いてしまう件についてでした。

    では、あでゅ~ノシ

    Category: 開発日記(Unity)

    tb 0 : cm 0