質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

2698閲覧

ObserveEveryValueChangedがStartメソッドを通った時点で実行されてしまう

Beat-san

総合スコア2

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2021/05/13 07:03

DOTweenAnimationをUniRxのObserveEveryValueChangedを利用して動かしたい

下記のスクリプトをDOtweenAnimationがついたオブジェクトに張り付けて、PlayerScript内のDOtweenAnimationをDORestart();で動かそうとしています。
**DORestart()**自体は__ObserveEveryValueChanged__でplayerHPの変化を検知して実行したいです。

しかし、下記の画像の通りスタートメソッドを通った時点でなぜかDORestart()を実行してしまっています。
イメージ説明
これがなぜ起きるのか教えていただきたいです。

該当のソースコード

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UniRx; 5using DG.Tweening; 6public class PlayerHPShaker : MonoBehaviour 7{ 8 private int playerHP=0; 9 private DOTweenAnimation dot; 10 void Awake() 11 { 12 playerHP=PlayerScript.Instance.Player_HP; 13 Debug.Log("a"+playerHP); 14 } 15 void Start() 16 { 17 Debug.Log("s"+playerHP); 18 dot = GetComponent<DOTweenAnimation>(); 19 dot.autoPlay=false; 20 this.ObserveEveryValueChanged(x => x.playerHP) 21 .Where(_ => _ > 0) 22 .Subscribe(_ => PlayHPDOTween()); 23 } 24 void Update() 25 { 26 Debug.Log("u"+playerHP); 27 playerHP=PlayerScript.Instance.Player_HP;//ここで変数が変化 28 } 29 void PlayHPDOTween(){ 30 Debug.Log("揺らす"); 31 dot.DORestart(); 32 } 33}

試したこと

・上記にある通りDebug.Logで確認したところAnimationのAutoPlayが原因ではないです。
・whereの部分を.Where(x => x),.Where(x => x>0)に変えてもだめでした。

補足情報(FW/ツールのバージョンなど)

unity2019.4.8

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

UniRxのコードを見ると初期値を必ず発行するようなので、不要な場合はSkip(1)で読み飛ばせばいいと思います。

diff

1this.ObserveEveryValueChanged(x => x.playerHP) 2+ .Skip(1) 3 .Where(_ => _ > 0) 4 .Subscribe(_ => PlayHPDOTween());

参考:ObserveEveryValueChangedのソースコード
https://github.com/neuecc/UniRx/blob/284d5c50d3f1ddd9fa7df3d382ea904732a9c2ff/Assets/Plugins/UniRx/Scripts/UnityEngineBridge/ObserveExtensions.cs#L67

投稿2021/05/13 08:49

tor4kichi

総合スコア769

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Beat-san

2021/05/13 15:06

おっしゃる通り、該当部分を書き加えたところ想定した通りの挙動をするようになりました。ありがとうございました。
tor4kichi

2021/05/16 07:09

一点補足ですが、`ObserveEveryValueChanged`はフレーム毎に値を読み取る動作をするため、基本的にパフォーマンスの改善余地がある書き方です。 `ReactivePropertySlim<T>`を利用すると変更通知可能なプロパティを作れます。ObserveEveryValueChangedよりも軽量に動作しますので、試作段階で`ObserveEveryValueChanged`使う程度で、なるたけ`ReactivePropertySlim<T>`の利用をお勧めします。
Beat-san

2021/05/18 03:43

そうなんですね!てっきりObserveEveryValueChangedが優れたものとばかりに思って調べていたので、目から鱗です。ご親切に教えてくださり、ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問