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

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

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

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

Unity

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

Q&A

3回答

4395閲覧

変数の数値の変化を待ってから処理を行うメソッドを作りたい。

meron-pan

総合スコア44

C#

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

Unity

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

0グッド

1クリップ

投稿2020/12/20 18:10

編集2020/12/21 02:32

前提・実現したいこと

クラスAにかなりの頻度で数値が変わる変数があり、その数値が変化したのを確認してから、処理を行い値を返すメソッドを作りたいと思っています。
以下のコードのGetOver5()のようなものを作りたいと思っていますが、この状態だとかなり処理が重たい(もしくは動作不可)ので、
値が変わった瞬間に、それが欲しい値かを判断して、正しい場合はreturnして、異なった場合はまた値が変わるのを待つ関数を作りたいのですが、どうすればいいのでしょうか?

GetOver5()の改善案みたいなのが欲しいです。

C#

1//仮想的なソースコード(動くことや正しさはあまり保証していません) 2using System.Collections; 3using System.Collections.Generic; 4using UnityEngine; 5 6class MyClass 7{ 8 private bool flag = false; 9 private int count = 0; 10 private int Count 11 { 12 set 13 { 14 this.count = value; 15 } 16 get 17 { 18 return this.count; 19 } 20 } 21 22 public int GetOver5() 23 { 24 flag = true; 25 //5以上の数字が出るまで待つ 26 while(true) 27 { 28 if(count > 4) 29 { 30 break; 31 } 32 } 33 flag = false; 34 return count; 35 } 36 37 Update() 38 { 39 if(flag != false) 40 { 41 Count = UnityEngine.Random.Range(0,10); 42 } 43 } 44} 45 46class MainClass 47{ 48 MyClass myClass = new MyClass(); 49 int store = myClass.GetOver5(); 50 Debug.Log(store); 51}

試したこと

eventやawait / async を見てみましたが、このような場合に使えるのかわかりません。

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

Unity 2019.3

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

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

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

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

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

Zuishin

2020/12/21 01:38

Rx を使うのが良いと思います。
guest

回答3

0

せっかく値のセットはSetterを通るわけなので、Setter部分で判断すればどうですか?

cs

1 private int Count 2 { 3 set 4 { 5 this.count = value; 6 // ここ 7 } 8 get 9 { 10 return this.count; 11 } 12 }

もしくは値のセットだけEventで発火するようにして、その値による処理はそれぞれに任せてもいいかもしれません

cs

1//仮想的なソースコード(動くことや正しさはあまり保証していません) 2using System.Collections; 3using System.Collections.Generic; 4using UnityEngine; 5using System; 6 7class MyClass 8{ 9 public event Action<int> OnCountChangeListener; 10 11 private bool flag = false; 12 private int count = 0; 13 private int Count 14 { 15 set 16 { 17 this.count = value; 18 OnCountChangeListener?.Invoke(value); 19 } 20 get 21 { 22 return this.count; 23 } 24 } 25 26 27 public int GetOver5() 28 { 29 flag = true; 30 //5以上の数字が出るまで待つ 31 while(true) 32 { 33 if(count > 4) 34 { 35 break; 36 } 37 } 38 flag = false; 39 return count; 40 } 41 42 Update() 43 { 44 if(flag != false) 45 { 46 Count = UnityEngine.Random.Range(0,10); 47 } 48 } 49} 50 51class MainClass 52{ 53 MyClass myClass = new MyClass(); 54 int store = myClass.GetOver5(); 55 Debug.Log(store); 56} 57

投稿2020/12/21 02:37

hogefugapiyo

総合スコア3302

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

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

meron-pan

2020/12/21 06:30

似たような処理の関数をいくつか作りたいので、後者のほうが理想的な解決策です。ただ、c#のイベントに詳しくないのでよくわからないのですが、イベントが発火するまで処理を待つというコードを書くことは可能なのでしょうか?
guest

0

導入が可能であればですが、UniRxを導入し、値が変更された時にイベントを発火させるのはどうでしょうか。もちろんSetterでのイベント発火でも大丈夫ですが、それに紐づく関数が多い場合ですと、条件分岐などが大変になると思うので、UniRxでのWhereなどの指定が便利かと思いました。

c#

1using UniRx; 2using UnityEngine; 3using UnityEngine.UI; 4 5public class SampleManager : MonoBehaviour 6{ 7 // これが値が変動するint型の変数です 8 public ReactiveProperty<int> count = new ReactiveProperty<int>(0); 9 10 [SerializeField] 11 private Text text; 12 13 void Start() 14 { 15 // countが5以上に変わった時にイベントを発火させます 16 count 17 .Where(_ => _ >= 5) 18 .Subscribe(_ => UpdateText()); 19 } 20 21 void UpdateText() 22 { 23 text.text = "ボタンが5回以上押されました"; 24 } 25 26 public void onClickButton() 27 { 28 // countを変動するところは、ただ単に値を変えるだけです 29 count.Value++; 30 } 31}

投稿2020/12/21 08:01

k_nakayama

総合スコア14

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

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

0

別関数の中で値をチェックするより、その変数を操作するプロパティの中で、値をチェックしてフラグ立てるなりイベント出すなりすればいいはなしですね

投稿2020/12/20 19:01

編集2020/12/20 19:11
y_waiwai

総合スコア87800

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問