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

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

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

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

Unity

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

Q&A

解決済

1回答

3491閲覧

【Unity】コルーチン処理とUpdate関数内の処理がバッティングしている

otonokotonoha

総合スコア5

C#

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

Unity

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

0グッド

0クリップ

投稿2020/04/14 15:03

前提・実現したいこと

Unity(C#)でカウントダウン機能と制限時間機能を1つのスクリプトで実装しようとしています。

カウントダウン機能はコルーチンで実装し、カウントダウンが終了した後にwaitForSecondsRealtime関数でフレームの一時停止を再開するようにしているのですが、Update関数内で毎フレーム毎コールされる制限時間(time.deltaTime関数で1秒ずつマイナスしていく処理)がなぜか1秒ほど経過した時点で処理が停止します。

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

Update関数内で毎フレーム毎コールされる制限時間(time.deltaTime関数で1秒ずつマイナスしていく処理)がなぜか1秒ほど経過した時点で処理が停止する

該当のソースコード

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.UI; 5 6public class timeManagement : MonoBehaviour 7{ 8 public float timerCount; 9 public Text timerText; 10 public int countdownTime; 11 public Text countdownText; 12 int seconds; 13 14 void Start() 15 { 16 timerText.text = timerCount.ToString(); 17 Time.timeScale = 0; 18 StartCoroutine(CountDownToStart()); 19 } 20 21 IEnumerator CountDownToStart() { 22 while(countdownTime > 0) { 23 countdownText.text = countdownTime.ToString(); 24 yield return new WaitForSecondsRealtime(1f); 25 countdownTime--; 26 } 27 28 countdownText.text = "start!!"; 29 Time.timeScale = 1; 30 yield return new WaitForSecondsRealtime(1f); 31 32 countdownText.gameObject.SetActive(false); 33 } 34 35 // Update is called once per frame 36 void Update() 37 { 38 timerCount -= Time.deltaTime; 39 timerText.text = Mathf.RoundToInt(timerCount).ToString(); 40 } 41} 42

試したこと

カウントダウン処理(コルーチン処理)をコメントアウトして実行すると、正常に制限時間の機能が実行され1秒1秒制限時間が減っていくことは確認しました。

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

unity 2018.4.11f1

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

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

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

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

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

shin1845

2020/04/15 02:15

countdownTimeはどこかで初期化されているのでしょうか?もしされてないのであればその値によっては CountDownToStart()内のwhile文内の処理が一切実行されないと思います。「time.deltaTime関数で1秒ずつマイナスしていく処理」とされてますが、実際には経過時間をtimerCountから引いているだけで1秒ずつ引いていないように見えるのですが、ソースコードは本当に上記のものであっていますでしょうか。
otonokotonoha

2020/04/15 12:19

コメントいただきありがとうございます! はい、上記ソースコードで合っております。 countdownTimeはスクリプト上で初期化せずに、Inspector上でcountdownTextのテキスト(String)に入れた値をint型に変換してcountdownTimerに格納していました。 おっしゃる通り経過時間をtimerCountから引いているのみで、1秒ずつ引いているのは私の間違いでした。
guest

回答1

0

ベストアンサー

countdownTimeはスクリプト上で初期化せずに、Inspector上でcountdownTextのテキスト(String)に入れた値をint型に変換してcountdownTimerに格納していました。

ならばStart()内にcountdonwTextの内容をcountdownTimeに格納する処理がなければないとダメではないでしょうか。上記コードではcountdownTimeの値がセットされてないと思われます(デフォルト初期値は恐らく0ですかね?)

ただその後countdownTimeをまたcountdownTextに入れているのでInspector上でcountdownTimeを設定してやれば特に処理を変えずに動くような気がしますが…。

投稿2020/04/15 13:29

shin1845

総合スコア64

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

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

otonokotonoha

2020/04/15 13:44

おっしゃる通りです。 現状、カウントダウンの機能についてはinspector上で値を与えてあげれば正常に動いているので問題はないかと思いますが問題はtimerの方ですね。 timerCountが60秒で初期化し、カウントダウンの処理が終わった後に動き始めるのですが、なぜか1秒分ほど動いた後に処理が終わるのです。 通常毎フレーム毎にupdate関数が呼ばれるはずが、なぜか数回呼ばれてストップします。(このカウントダウンの処理をコメントアウトするとtimerの処理が正常に動くので、おそらく何かの処理が噛み合っていないように思います)
shin1845

2020/04/15 13:58

otonokotonoha様が投稿されたコードのまま手元で確認してみましたが、こちらの環境では何の問題もなく動作しております。ただtimerTextとcountdownTextを表示しているだけの状態ですので、ほかのオブジェクトやスクリプトがいるならそれがもしかしたら何か悪さをしているのかも知れませんね… update()内のどこかにブレークポイントを仕掛けてみて、止まる直前の動作を追いかけてみてはどうでしょうか
otonokotonoha

2020/04/16 13:07

再現いただきありがとうございます! 一旦こちらの機能はペンディングとし、他の機能の実装を進めることにします! たくさんご助言いただきましたので、ベストアンサーとさせていただきます!
shin1845

2020/04/17 00:08

問題の解決に至らず申し訳ないです…
otonokotonoha

2020/04/17 12:01

とんでもないです! コメントいただけたことがとても嬉しかったのです、たのしいUnity開発ライフを!:)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問