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

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

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

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

Q&A

1回答

1060閲覧

0.1秒間隔で値を更新したい。

kotowari_yasusi

総合スコア17

Unity

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

0グッド

0クリップ

投稿2019/07/30 09:45

編集2019/07/30 09:57

前提・実現したいこと

マス目移動を実装するべくVector2の値を0.1秒間隔で変更したい。(0.1秒ごとに1マス動く)

発生している問題・エラーメッセージ

UniRXが便利だと耳にして見様見真似でやってみましたがうまくいかず
Subscribe(_ => PlayerMove);の PlayerMoveに以下のエラー表示が出ます。(VisualStudio上)

割り当て、呼び出し、インクリメント、デクリメント、待機、および新しいオブジェクトの式のみがステートメントとして使用できます

該当のソースコード

```C# [SerializeField] private float InputInterval = 0.1f; public Vector2 Direction => this.UpdateAsObservable() .Where(_ => Input.anyKey) .ThrottleFirst(TimeSpan.FromSeconds(InputInterval)) .Subscribe(_ => PlayerMove); public Vector2 PlayerMove() { int x = (int) Input.GetAxisRaw("Horizontal"); int y = (int) Input.GetAxisRaw("Vertical"); return new Vector2(x, y); }

試したこと

いろいろググりましたが、Debug.Logでの例しか出てきませんでした。

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

覚えていて損はないということでなるべくならUniRXでの解決をしたいです。
もし根本的にUniRXに関する知識理解が足りていないorこれにはUniRXは向かないということならそうご指摘ください。

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

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

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

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

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

fiveHundred

2019/07/30 09:53

エラーが出ているのであれば、その内容を記載してください。 (質問は編集できます)
kotowari_yasusi

2019/07/30 09:59

ご指摘ありがとうございます。質問を編集しました。
guest

回答1

0

Observableに値変更を発行したり受け取ったりする場合にはReactivePropertyを使用すると便利です。今回のDirectionは見た限りでは「値を変換し受け取るだけ」なのでReadOnlyReactivePropertyを使用するとよさそうです。

csharp

1[SerializeField] 2private float InputInterval = 0.1f; 3 4public ReadOnlyReactiveProperty<Vector2> Direction { get; } 5 6public void Start() 7{ 8 Direction = this.UpdateAsObservable() 9 .Where(_ => Input.anyKey) 10 .ThrottleFirst(TimeSpan.FromSeconds(InputInterval)) 11 .Select(_ => PlayerMove()) 12 .ToReadOnlyReactiveProperty() 13 .AddTo(this); 14} 15 16public Vector2 PlayerMove() 17{ 18 int x = (int) Input.GetAxisRaw("Horizontal"); 19 int y = (int) Input.GetAxisRaw("Vertical"); 20 return new Vector2(x, y); 21} 22

体裁を整えてはみましたが実際の動作は確認していないので、エラーでたらすみません。

.Select()によって値の変形を行い、.ToReadOnlyReactiveProperty()で購読+プロパティ化をして、さらに.AddTo(this)OnDestroyのタイミングでこの購読が破棄されるようにしています。

ここからDirectionに対してSubscribe()してキャラクターの移動に反映させる感じでしょうか。

参考

【C#】ReactiveProperty全然分からねぇ!って人向けのFAQ集【修正済】

UniRx入門 ~ データバインディングとUnityイベント関数の購読 ~

【UniRx】AddTo とは何かまとめてみた

投稿2019/07/30 11:05

tor4kichi

総合スコア763

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問