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

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

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

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

Unity

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

Q&A

解決済

2回答

3054閲覧

unityで経過時間の取得、取得後に初期化、再取得したい

na.

総合スコア7

C#

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

Unity

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

0グッド

0クリップ

投稿2018/03/25 08:13

編集2018/03/25 08:21

前提・実現したいこと

お世話になります。
unityで経過時間の取得、その後初期化して再取得したいと思っています。
開発言語はC#です。

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

下記のコードですが、開始時刻をdatetime型の[start]に格納し、DateTime.Now(現在時刻) から[start]を引いた値をTimespan型の[ts]に代入しています。 その後、[ts]に格納したtimespan型の値から秒数部分をint型の[second]に代入しました。 ここまではうまく動いているのですが、最後にApplication.LoadLevelでリセットを行った際、 [start],[ts]は初期化されているのですが、[second]のみが初期化前の値を保有していて、0か らのスタートができません。 例えば開始から10秒経過後にApplication.LoadLevelを行った場合、 Debug.Log("second: " + second);で示す[second]の値は初期化後も10のままです。 そして初期化から10秒経過後に11、12、13と増えていきます。 初期化後に[second]も0から始める方法はないでしょうか。 アプリ制作上の事情でTime.deltaTimeは使えません。 お知恵を貸していただけると幸いです。

該当のソースコード

C# using System.Collections; using System.Collections.Generic; using UnityEngine; using System; public class TimeTest : MonoBehaviour { private DateTime start; private TimeSpan ts; private int second; void Start() { start = DateTime.Now;//開始時刻の取得 } void Update() { ts = DateTime.Now - start;//現在時刻から開始時刻を引いた値をtsに代入 second = (int)ts.TotalSeconds;//tsの秒数部分をint型に変換しsecondに代入 Debug.Log("second: " + second); if (Input.GetKey(KeyCode.Space)) { Application.LoadLevel("Main");//Sceneの初期化 } } }

試したこと

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

unity2017.2of3

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

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

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

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

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

guest

回答2

0

ベストアンサー

Application.LoadLevel("Main");//Sceneの初期化

といっしょに、Start() を呼べばいいという話でしょうか?

投稿2018/03/25 08:38

y_waiwai

総合スコア87774

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

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

na.

2018/03/25 08:50

y_waiwai様 回答ありがとうございます。 初心者なもので、勘違いしてたらすみません。 if (Input.GetKey(KeyCode.Space)) { Application.LoadLevel("Main");//Sceneの初期化 Start(); } とすればよいということでしょうか? これでもうまくいかず、初期化後の[second]の数値は初期化前の値を持ったままでした。 引き続きご教授いただければ幸いです。
y_waiwai

2018/03/25 08:54

secondの変数はUpdate関数の実行時にしか変更されてません。 0クリアしたいのなら、Start関数の中で、second=0; を実行すればいいのでは
na.

2018/03/25 09:06

Start関数の中にsecond = 0;を入れても結果は同じでした。 例えば開始から10秒たった時にUpdate関数の中の Debug.Log("second: " + second);で表示される値が[second: 10]で、 Application.LoadLevel("Main");を実行した後も変わらず、[second: 10]のままです。 [ts]は初期化されて0になっているのに、[ts]の秒数を取得しているはずの[second]が何故か10のままになっています。 そして、初期化から10秒経過後に11,12,13…と増えていくのです。
y_waiwai

2018/03/25 09:10

> Application.LoadLevel("Main");を実行した後も変わらず、[second: 10]のままです。 この関数の中でsecond に0を代入しなければ、そりゃそのまま10です。 ここで0にしたいなら、この関数の後に、 second=0; を入れてください って、なんか勘違いなされてるように思われますが。
na.

2018/03/25 09:18

何度も回答いただきありがとうございます。 理解しきれてなくてすみません;; if (Input.GetKey(KeyCode.Space)) { Application.LoadLevel("Main");//Sceneの初期化 second = 0; } このように修正したのですがsecondが0になってくれません。 どういうことなのでしょうか…
na.

2018/03/25 09:25

Application.LoadLevel("Main");を実行したことにより、dateTime.Nowが再取得されて、[ts]は0からの スタートになっています。 [ts]が0になればその秒数を取得している[second]も0になるという認識なのですが、間違ってるのでしょ うか…
y_waiwai

2018/03/25 09:40

それはそのとおりです。 > second = (int)ts.TotalSeconds;//tsの秒数部分をint型に変換しsecondに代入 ここでsecondの値は更新されます
na.

2018/03/25 10:02

ありがとうございます。 Application.LoadLevel("Main");を実行後に[ts]が0になるのは確認できています。 秒数が経過するまで second = (int)ts.TotalSeconds; か Debug.Log("second: " + second); のどちらかがうまく実行されていないということになりますよね。 もう少し考えてみます。
y_waiwai

2018/03/25 10:06

VisualStudioを使ってるなら、任意の行でブレークポイントを設定して止めて、その時点の変数の値を読むことができるので、そこらへんいろいろやってみればどうでしょう
na.

2018/03/25 21:50

secondをint型ではなく、double型にすることによって解決しました。 ありがとうございました!
guest

0

DateTime型からTotalSeconsを取得する際の変数をint型ではなくdouble型にしておくことにより解決いたしました。

投稿2018/03/25 21:52

na.

総合スコア7

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問