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

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

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

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

Unity

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

Q&A

解決済

3回答

6216閲覧

Unity C# 変数が~~になるまで待つ をつくりたい

ssssggg

総合スコア40

C#

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

Unity

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

0グッド

0クリップ

投稿2019/04/01 08:36

編集2019/04/01 09:11

Unityについてです。変数が~~になるまで待つという命令を作りたいのですが、どうすれば良いでしょうか。

コードA


for(int B = 0; B < 1;)
{
B = flee;
}
Debug.Log("aaaaa");


コードAは、他のメソッドで操作されている、int型の変数fleeがあり、それが1になったら、Debug.Logが発動するという内容です。forで囲まれた部分が、fleeが1になるまで、その下にある内容を妨害する役目をしています。
しかしこのコードだと重くなってしまいます。

コードB


yield return new WaitForSeconds(0.2f);
Debug.Log("aaaaa");


コードBは、0.2秒経つと、Debug.Logが発動するという内容です。
1行目は、下の内容を0.2秒間妨害する役目をしています。

このコードBの、1行目の()の中身を変えて、コードAのように、変数fleeが1になるまでずっと妨害し続けるという内容にしたいのですがどうすれば良いのでしょうか。

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

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

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

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

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

stdio

2019/04/01 08:40

え?ごめん... 私の理解力が足りないのか、質問の内容が全く理解できません。 何がしたいのかもう少し具体的にお願いします。
hogefugapiyo

2019/04/01 08:47

その変数は一体なんの値を扱うものですか? その変数が~~になるというのはどういった状況でしょうか。 どういった機能を実現するために、この処理が必要なのでしょうか。
papinianus

2019/04/01 08:48

その変数はどうなったら、変化するのでしょうか?
ssssggg

2019/04/01 08:54

すみません。追記します。
guest

回答3

0

ベストアンサー

普通に組み合わせればいいです。

C#

1IEnumerator MyLoop(){ 2 for(int B = 0; B < 1;) 3 { 4 B = flee; 5 yield return new WaitForSeconds(0.2f); 6 } 7 Debug.Log("aaaaa"); 8 9 //別案:whileはカッコの中身がtrueの間ループを続ける 10 while(flee == 0) 11 { 12 yield return new WaitForSeconds(0.2f); 13 } 14 Debug.Log("aaaaa"); 15}

元コードAは変数fleeが1になるまでずっと妨害し続けるというよりも、厳密には待機時間を一切設けずに変数チェックを繰り返す。変数チェックがOKなら繰り返しを抜けて先に進むという動き。
元コードBは0.2秒待ってから先に進むという動き。
なので組み合わせれば「0.2秒待ってから変数チェック」を繰り返す。変数チェックがOKなら繰り返しを抜けて先に進むになります。

あと違う考え方として「オブザーバー(Observer)パターン」というのもあります。
コーディングに慣れてきたら「UniRx」で検索してみてください。

投稿2019/04/01 09:44

編集2019/04/01 09:45
sakura_hana

総合スコア11427

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

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

ssssggg

2019/04/01 13:38

ご丁寧な回答ありがとうございます。処理を繰り返すだけでは待機時間は進まないのですね。
sakura_hana

2019/04/03 01:46

解決して何よりです。一応余談を。 >処理を繰り返すだけでは待機時間は進まないのですね。 実際は進んでいます。ただし進んでいるのはループ1回あたり「スクリプト数行分を処理する時間」なので、0.00001秒(値は適当)などのメチャクチャ短い時間になります。 つまり1秒間に数万とか数十万回判定することになりますので、その分負荷が掛かって重くなります。
guest

0

単純にUpdate()FixedUpdate()内で変数をチェックしてあげるやり方じゃ難しいのでしょうか?

cs

1void Update(){ 2 if(flee >= 1) { 3 Debug.Log("flee is " + flee); 4 Debug.Log("aaaaa"); 5 } 6} 7

投稿2019/04/01 09:13

hogefugapiyo

総合スコア3302

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

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

ssssggg

2019/04/01 13:29

回答ありがとうございます。考え方を変えることも大切だと気付きました。
guest

0

コルーチンを使っていて、特定の条件を満たすまで待つのであれば
yield return new WaitUntil(flee != 1);
が簡単です。

投稿2019/04/02 01:02

suppori

総合スコア19

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問