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

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

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

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

Unity

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

Q&A

解決済

1回答

831閲覧

【Unity】case内で変数に数を入れているはずなのにDebug.Logで見ると入っていない

.com

総合スコア8

C#

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

Unity

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

0グッド

0クリップ

投稿2021/04/20 07:12

編集2021/04/20 07:13

前提・実現したいこと

現在、1週間くらい前に質問したアニメーションを指定した秒数まで逆再生して、指定した秒数分の逆再生が終わったら再生という事が出来ています。(最初の10秒間だけ)

今は最初の10秒間だけしかできないのは、case内でtimeにそれぞれ1,2,3,4,5をtime = 5;(1例)と入れていますが、Debug.Logで見た感じ数が入っていないからです。

例えば6秒で押した場合
1,2,3,4,5,6...(ここで2秒カウントアップが止まる)...7,8,9,10,11,12,13.....
となってしまいます。

これを
1,2,3,4,5,6...(ここで2秒カウントアップが止まる)...4,5,6,7,8,9.....
とさせたいです。

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

case内で変数に数を入れることができていないため、下の感じ(6秒で押したときの例)になってしまいます。
1,2,3,4,5,6...(ここで2秒カウントアップが止まる)...7,8,9,10,11,12,13.....

エラーメッセージ:なし

該当のソースコード

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class ClockAnimation : MonoBehaviour 6{ 7 // Animatorを入れる変数 8 private Animator animator; 9 10 float time = 0.0f; // 時間を測る変数 11 float state = 0; // caseで管理するための時間を入れておく変数 12 float BackTime = 0.0f; // 戻る時間入れる変数(今は使っていない) 13 14 public GameObject Clock; 15 16 void Start() 17 { 18 // 砂時計のAnimatorにアクセスする 19 animator = GetComponent<Animator>(); 20 // Timerを呼び出し、その後は1秒毎に実行 21 InvokeRepeating(nameof(Timer), 0.0f, 1.0f); 22 // ↓今だけ 23 InvokeRepeating(nameof(DebugLog), 0.0f, 1.0f); 24 // 通常再生 25 Play(); 26 } 27 28 void Update() 29 { 30 //if (Input.GetKeyDown("joystick button 0")) 31 if (Input.GetKeyDown(KeyCode.K)) 32 { 33 FunctionPut(); 34 ClockCase(); 35 } 36 } 37 38 // timeの値確認用(今だけ) 39 void DebugLog() 40 { 41 Debug.Log(time); 42 } 43 44 // 時間を測る 45 void Timer() 46 { 47 time += 1; 48 } 49 50 // timeは1秒ごとに変わるのでstateに置き換えてcaseを処理する 51 void FunctionPut() 52 { 53 state = time; 54 } 55 56 public void ClockCase() 57 { 58 switch(state) 59 { 60 case 0: // 残り10秒 61 break; 62 case 1: // 残り9秒 63 break; 64 case 2: // 残り8秒 65 break; 66 case 3: // 残り7秒 67 break; 68 case 4: // 残り6秒 69 break; 70 case 5: // 残り5秒 71 Reverse(); 72 Invoke("Play", 1f); // 1秒後通常再生開始 73 state = 5; // 時間とstateを戻った時間に合わせる 74 time = 5; 75 break; 76 case 6: // 残り4秒 77 Reverse(); 78 Invoke("Play", 2f); // 2秒後通常再生開始 79 state = 4; // 時間とstateを戻った時間に合わせる 80 time = 4; 81 break; 82 case 7: // 残り3秒 83 Reverse(); 84 Invoke("Play", 4f); // 4秒後通常再生開始 85 state = 3; // 時間とstateを戻った時間に合わせる 86 time = 3; 87 break; 88 case 8: // 残り2秒 89 Reverse(); 90 Invoke("Play", 6f); // 6秒後通常再生開始 91 state = 2; // 時間とstateを戻った時間に合わせる 92 time = 2; 93 break; 94 case 9: // 残り1秒 95 Reverse(); 96 Invoke("Play", 8f); // 8秒後通常再生開始 97 state = 1; // 時間とstateを戻った時間に合わせる 98 time = 1; 99 break; 100 case 10: // 残り0秒 101 state = 10; // これでゲームオーバーなので10を入れる 102 time = 10; 103 break; 104 default: 105 break; 106 } 107 } 108 109 // 再生 110 public void Play() 111 { 112 animator.SetFloat("speed", 1.0f); 113 } 114 115 // 一時停止 116 public void Pause() 117 { 118 animator.SetFloat("speed", 0.0f); 119 } 120 121 // 逆再生 122 public void Reverse() 123 { 124 animator.SetFloat("speed", -1); 125 // ↑と↓どっちが良いか悩み中 126 //animator.SetFloat(Animator.StringToHash("speed"), -1); 127 //animator.Play("Death", 0, 1f); 128 } 129} 130 131 132

試したこと

変数に数を入れる用の関数を作って↓caseのInvokeの後に入れてみた。
→変わりませんでした。

C#

1void seven() 2 { 3 state = 3; 4 time = 3; 5 } 6 7 void eight() 8 { 9 state = 2; 10 time = 2; 11 } 12 13 void nine() 14 { 15 state = 1; 16 time = 1; 17 }

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

Unityのバージョン:2020.2.0b2.3094 Personal

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

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

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

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

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

guest

回答1

0

自己解決

つい先程質問したばかりですが、この処理できましたw

出来ていなかった理由はInvokeは処理を指定秒数待って処理するだけで後ろに書いた
state = □;time = □;はInvoke内ではないのでInvokeの指定秒数を待たずに処理されるからでした。

つまり質問したコードの状態では、
例:6秒でボタンを押した場合)
1,2,3,4,5,6(ボタンを押して[4]がtimeに入る)5,6,7(2秒後のここで再生開始),8,9,10,11
という感じの処理になっていました。

それを
例:6秒でボタンを押した場合)
1,2,3,4,5,6(ボタンを押して[2]がtimeに入る)3,4,5(2秒後のここで再生開始),6,7,8,9,10,11
となるように変えました。

下が変えたコードです。

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class ClockAnimation : MonoBehaviour 6{ 7 // Animatorを入れる変数 8 private Animator animator; 9 10 float time = 0.0f; // 時間を測る変数 11 float state = 0.0f; // caseで管理するための時間を入れておく変数 12 float BackTime = 0.0f; // 戻る時間入れる変数(今は使っていない) 13 14 public GameObject Clock; 15 16 void Start() 17 { 18 // 砂時計のAnimatorにアクセスする 19 animator = GetComponent<Animator>(); 20 // Timerを呼び出し、その後は1秒毎に実行 21 InvokeRepeating(nameof(Timer), 1.0f, 1.0f); 22 // ↓今だけ 23 InvokeRepeating(nameof(DebugLog), 0.0f, 1.0f); 24 // 通常再生 25 Play(); 26 } 27 28 void Update() 29 { 30 if (Input.GetKeyDown("joystick button 1")) 31 //if (Input.GetKeyDown(KeyCode.K)) 32 { 33 FunctionPut(); 34 ClockCase(); 35 } 36 } 37 38 // timeの値確認用(今だけ) 39 void DebugLog() 40 { 41 Debug.Log(time); 42 } 43 44 // 時間を測る 45 void Timer() 46 { 47 time += 1; 48 } 49 50 // timeは1秒ごとに変わるのでstateに置き換えてcaseを処理する 51 void FunctionPut() 52 { 53 state = time; 54 } 55 56 public void ClockCase() 57 { 58 switch(state) 59 { 60 case 0: // 残り10秒 61 break; 62 case 1: // 残り9秒 63 break; 64 case 2: // 残り8秒 65 break; 66 case 3: // 残り7秒 67 break; 68 case 4: // 残り6秒 69 break; 70 case 5: // 残り5秒 71 Reverse(); 72 Invoke("Play", 1f); // 1秒後通常再生開始 73 state = 4; // 時間とstateを戻った時間に合わせる 74 time = 4; 75 break; 76 case 6: // 残り4秒 77 Reverse(); 78 Invoke("Play", 2f); // 2秒後通常再生開始 79 state = 2; // 時間とstateを戻った時間に合わせる 80 time = 2; 81 break; 82 case 7: // 残り3秒 83 Reverse(); 84 Invoke("Play", 4f); // 4秒後通常再生開始 85 state = -1; // 時間とstateを戻った時間に合わせる 86 time = -1; 87 break; 88 case 8: // 残り2秒 89 Reverse(); 90 Invoke("Play", 6f); // 6秒後通常再生開始 91 state = -4; // 時間とstateを戻った時間に合わせる 92 time = -4; 93 break; 94 case 9: // 残り1秒 95 Reverse(); 96 Invoke("Play", 8f); // 8秒後通常再生開始 97 state = -7; // 時間とstateを戻った時間に合わせる 98 time = -7; 99 break; 100 case 10: // 残り0秒 101 state = 10; // これでゲームオーバーなので10を入れる 102 time = 10; 103 break; 104 default: 105 break; 106 } 107 } 108 109 // 再生 110 public void Play() 111 { 112 animator.SetFloat("speed", 1.0f); 113 } 114 115 // 一時停止 116 public void Pause() 117 { 118 animator.SetFloat("speed", 0.0f); 119 } 120 121 // 逆再生 122 public void Reverse() 123 { 124 animator.SetFloat("speed", -1); 125 // ↑と↓どっちが良いか悩み中 126 //animator.SetFloat(Animator.StringToHash("speed"), -1); 127 //animator.Play("Death", 0, 1f); 128 } 129} 130

結局のところ、case内で変数に数が入っていないのではなく、ちゃんと数は入っていて、その入れようとした数が間違っていただけでした。
頭が固いのでかなり簡単な事の見落としをよくしてしまいます。またミスってる所が出てきたら質問するのでその時はよろしくお願いします。

投稿2021/04/20 08:48

編集2021/04/20 08:53
.com

総合スコア8

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問