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

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

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

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

Unity3D

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

Unity

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

Q&A

解決済

1回答

4274閲覧

特定の条件後に時間やTime.deltaTimeを止めたい

nissei

総合スコア35

C#

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

Unity3D

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

Unity

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

0グッド

1クリップ

投稿2017/09/29 07:05

レースゲーム等でゴールした後、リザルト画面にてクリアにかかった時間を表示させる仕様があると思いますが、
クリアと同時に計測している時間を止めたい(または時間経過をしている処理を停止)させたいのですがうまくいきません。

<テキストオブジェクト>

[SerializeField] private Text timerText; public float time; // Use this for initialization void Start () { time = 0; } // Update is called once per frame void Update () { time += Time.deltaTime; timerText.GetComponent<Text>().text = time.ToString("F2"); //リザルト画面に経過したタイムを引き渡す float num_1 = GameObject.Find("GameText").GetComponent<TimeCount>().time; PlayerPrefs.SetFloat("TIME", num_1); }

<プレイヤーオブジェクト>

if (col.gameObject.tag == "GOOL") { TimeCount tc = GameObject.Find("Time_text").GetComponent<TimeCount>(); 「 ここにテキストについてるスクリプト内のTime.deltaTimeの処理を停止 」 }

とまでは出来たのですが、Time.deltaTimeの停止方法で壁にぶつかってしまいました。
Time.timeScale == 0を恐らく何処かに記述するだろうとは予想がつくのですが。。。
判る方ぜひご教授願いたいです!

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

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

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

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

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

guest

回答1

0

ベストアンサー

Time.timeScaleを触ると止まって欲しくないものが止まったりするのでTime.timeScaleを触らずイベントを介して伝えると楽です。

実装側

C#

1public class manager : MonoBehaviour 2{ 3 //イベントを定義 デリゲートをそのまま定義してもいいですが、外から触れると面倒なことになる可能性があるのでイベントで定義しています。 4 public static event System.Action<bool> StopTimeEvent = delegate{}; 5 6 //時間を止めたい場合この関数を呼ぶ 7 public static void stopTime(bool isStop) 8 { 9 if (StopTimeEvent != null) StopTimeEvent(isStop); 10 } 11}

使う側

C#

1//trueの時、Updateを止める 2bool freezeUpdate; 3 4void OnEnable() 5{ 6 //オブジェクトがアクティブになったタイミングでイベントを紐付け 7 manager.StopTimeEvent += stopTimeEvent; 8} 9 10void OnDisable() 11{ 12 //オブジェクトがディセーブルになったタイミングでイベントを外す 13 manager.StopTimeEvent -= stopTimeEvent; 14} 15 16void Update() 17{ 18 if(freezeUpdate) return; 19 20 //ここに処理 21} 22 23//ここにストップイベントの処理を書く 24void stopTimeEvent(bool isStop) 25{ 26 freezeUpdate = freezeUpdate; 27 28 if(isStop) 29 { 30 //ストップした時の処理 31 } 32 else 33 { 34 //ストップ解除した時の処理 35 } 36}

ストップした時の処理とストップ解除した時の処理を書くところを設けました。たまに「ストップするタイミングで処理をはさみたい」みたいなことがあるのでそういう時に使えます。

注意点

  1. メソッドやイベントをstaticにしない実装にしたい場合、OnDisableを実行するタイミングでイベント登録先(ここではmanager)が破棄された後の可能性があるので、その場合はインスンタンスのnullチェックを入れてください。

  2. OnDisableでイベントを破棄したくない場合、自身が削除後にイベント発火する可能性があるのでOnDestroyでイベントの破棄を行なってください。

投稿2017/09/29 07:46

編集2017/09/29 08:00
IShix

総合スコア1724

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

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

nissei

2017/09/30 07:28

ありがとうございます。 せっかく教えて頂いたのに、大変恐縮ですが今の私にはまだまだ実力不足の為、理解が及ばず使いこなせないです。。。 ですが折角教えてくれた以上結果を残したいと努力していきます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問