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

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

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

ReactiveX(Rx、Reactive Extensions)は、リアクティブプログラミングが可能なライブラリ。Java/Android用のRxJava、JavaScript用のRxJSなどさまざまな言語向けに実装されています。

C#

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

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

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

Q&A

解決済

2回答

2211閲覧

UniRXで既存AssetのEventを簡単にストリーム化したい

koz555

総合スコア5

ReactiveX

ReactiveX(Rx、Reactive Extensions)は、リアクティブプログラミングが可能なライブラリ。Java/Android用のRxJava、JavaScript用のRxJSなどさまざまな言語向けに実装されています。

C#

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

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

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

0グッド

0クリップ

投稿2021/09/03 06:41

購入したAssetに以下のようなEventがあります。
色々調べてObservable.FromEventなどを試していますが、コンパイルエラーが解決できません。

・購入したAssetのValueChangedというイベント(このようなイベントが他に大量にある)

ストリーム化したいイベント playerCombatant.Status[MyGame.CombatantStatusValue.HP].ValueChanged ValueChangedの定義部分 public class StatusValue : ISaveData public event NotifyCombatantInt2 ValueChanged; NotifyCombatantInt2の定義部分 public delegate void NotifyCombatantInt2(Combatant combatant, int id, int change);

これをFromEventでストリーム化出来るのかと、例えば以下の様に試したりしていますがSystem.Actionにする書き方(そもそもする必要があるか?)が分からずコンパイルが通りません。

Observable.FromEvent<NotifyCombatantInt2>( h => playerCombatant.Status[MyGame.CombatantStatusValue.HP].ValueChanged += h, h => playerCombatant.Status[MyGame.CombatantStatusValue.HP].ValueChanged -= h ).Subscribe・・・

後々UniRXのオペレータでストリームを加工して使っていきたいので、このような購入Assetにあるイベントをストリーム化する方法を理解しておきたいです。

よろしくお願いいたします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

UniRxのObservable.FromEventを使う - Qiita
の一番最後の例を参考にしてください

Observable.FromEventで引数を受け取りたい場合 - 株式会社BEFOOL ブログ

このあたりを参考にしてください

要するに引数は一つしか渡せないので、引数をまとめたクラスを作ってそいつに突っ込みましょうとのことです。

こんな感じ?

C#

1// HogeEventArgsグラスを適切に定義する 2 3var observable = Observable.FromEvent<NotifyCombatantInt2, HogeEventArgs>>( 4 h => (combatant,id,change) => h(new HogeEventArgs() { /*...*/ }), 5 h => playerCombatant.Status[MyGame.CombatantStatusValue.HP].ValueChanged+= h, 6 h => playerCombatant.Status[MyGame.CombatantStatusValue.HP].ValueChanged-= h 7);

投稿2021/09/03 06:47

編集2021/09/03 07:06
ozwk

総合スコア13553

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

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

0

owzkさん
ありがとうございます!

そのサイトも読んでいたのですが、Action<>が必要なのか?と理解出来ていませんでした。
普段はインスタンス変数のValueChangedを使ったりするので、HogeEventArgsのそれぞれの変数の初期値には何を入れるべきなのか理解出来ていませんが、
とりあえず
↓のようにする事で希望の動作になりました!

public class HogeEventArgs : EventArgs { public Combatant combatant; public int id; public int change; } public class HPProgressManager : MonoBehaviour { ・・・略・・・ // UniRX版 var observable = Observable.FromEvent < NotifyCombatantInt2, HogeEventArgs> ( h => (combatant, id, change) => h(new HogeEventArgs() { combatant = playerCombatant,id = 0, change = 0}), h => playerCombatant.Status[MyGame.CombatantStatusValue.HP].ValueChanged+= h, h => playerCombatant.Status[MyGame.CombatantStatusValue.HP].ValueChanged-= h ); observable.Subscribe(x => { Debug.Log("changed!!" + x.combatant.GetName() + " value:" + x.change); HPGageUpdate(); }).AddTo(this); ・・・略・・・

投稿2021/09/03 07:51

koz555

総合スコア5

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問