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

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

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

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

Unity

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

Q&A

1回答

1253閲覧

経過時間停止中に他のプログラムを実行する方法

tadahix

総合スコア0

C#

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

Unity

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

0グッド

0クリップ

投稿2021/09/20 07:25

編集2021/09/20 07:30

やりたいこと

unityとC♯について質問です。下の3つのコードを作成し、一つ目のコードをtext、二つ目のコードをbuttonにアタッチして、二つ目のコードがアタッチされたbuttonを押すと時間経過がtextのところで始まる、もう一度buttonを押すと時間経過が一時的に止まるというのをbuttonを押すたびに繰り返すようにしました。しかし、時間経過が一時停止してる段階だと他のupdate関数を用いる処理が動かなくなる場合があります。例えば3つ目のWキーを押すとアタッチしたキューブなどのオブジェクトが動くコードなどが動きません。これの原因としては、一つ目のコードのTime.timeScale =0;のところ周辺にあると思うのですが、経過時間を一時停止させている時でも3つ目のコードのようなコードを動かすコードの書き方はありませんか??何卒よろしくお願いします!!

C♯

1 2using UnityEngine; 3using System.Collections; 4using UnityEngine.UI; 5 6public class TimerTime : MonoBehaviour 7{ 8 9 private Text timerText; 10 private int minute,hour; 11 private float seconds; 12 private float oldSeconds; 13 // 最初の時間 14 private float startTime; 15 16 void Start() 17 { 18 timerText = GetComponentInChildren<Text>(); 19 oldSeconds = 0; 20 startTime = Time.time; 21 Time.timeScale =0; 22 } 23 24 void Update() 25 { 26 27 // Time.timeでの時間計測 28 seconds = Time.time - startTime; 29 30 minute = (int)seconds / 60; 31 32 hour= (int)minute / 60; 33 34 if ((int)seconds != (int)oldSeconds) 35 { 36 timerText.text = hour.ToString("00") + ":" + ((int)(minute % 60)).ToString("00") + ":" + ((int)(seconds % 60)).ToString("00"); 37 } 38 oldSeconds = seconds; 39 40 41 } 42 43 44 45 } 46

C♯

1 2using System.Collections; 3using System.Collections.Generic; 4using UnityEngine; 5 6public class TimerPause : MonoBehaviour 7{ 8 // Start is called before the first frame update 9 public void Onclick() 10 { 11 Time.timeScale = Mathf.Approximately(Time.timeScale, 0f) ? 1f : 0f; 12 } 13 14} 15

C♯

1 2using UnityEngine; 3using System.Collections; 4public class Cube : MonoBehaviour 5{ 6 // Use this for initialization 7 void Start() 8 { 9 } 10 // Update is called once per frame 11 void Update() 12 { 13 if (Input.GetKey(KeyCode.W)) 14 { 15 transform.position += new Vector3(0, 0, 1 * Time.deltaTime); 16 } 17 18 } 19} 20

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

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

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

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

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

guest

回答1

0

時間経過が一時停止してる段階だと他のupdate関数を用いる処理が動かなくなる場合があります。

Time.timeScale が 0 でも Update は呼ばれ続けますが、Time.deltaTime は当然 0 になるのでそこに書いてある処理は「ゼロベクトルの方向に動け」という意味のないものになります。

経過時間を一時停止させている時でも3つ目のコードのようなコードを動かすコードの書き方はありませんか??

上で書いた通り、Time.deltaTime が 0 なだけで、そのコードは動いています。

やりたい事に応じて、Time.timeScale の影響を受けるものと受けないものがそれぞれ何なのかを考慮する必要があります。

「何がしたいのか」を書いていないので、回答はここまでになります。

投稿2021/09/20 07:39

bboydaisuke

総合スコア5308

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

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

tadahix

2021/09/20 08:04 編集

ご回答くださりまして誠にありがとうございます。 説明いただきました内容、なんとなくですが理解できました。例えばですが、3つ目のコードとして記載したWキーを入力するとアタッチしたオブジェクト(キューブなど)が経過時間を停止した状態で動かしたいということがやりたいことである場合はどうしたら良いでしょうか?
bboydaisuke

2021/09/20 08:45

ここに書かれても私しか見ないので、質問の方を編集してください。 > 経過時間を停止した状態で動かしたい Time.deltaTime を適切な値に置き換えればいいんじゃないでしょうか。 ただし、Unity に慣れた人は、「一時停止」に「Time.timeScale を 0 にする」という手法を取らないでしょう。 例: https://github.com/dsuz/csharp-2021/wiki/2nd-term-7th-week#%E4%BD%BF%E7%94%A8%E4%BE%8B-1---%E3%82%B2%E3%83%BC%E3%83%A0%E3%82%92%E4%B8%80%E6%99%82%E5%81%9C%E6%AD%A2%E3%81%99%E3%82%8B
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問