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

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

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

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

Unity3D

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

Q&A

解決済

1回答

1938閲覧

Getkeydownで複数回処理が行われている?

ymdhotnoa

総合スコア12

C#

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

Unity3D

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

0グッド

0クリップ

投稿2021/07/28 00:51

前提・実現したいこと

ボードゲームで、カウントダウンが終わったら(Turn)を呼び出し、WASDを入力したら駒の座標を変えつつカメラを180度回転させるというスクリプトを書いています。tの動き方としては、自分のターンの時は偶数、相手のターンの時は奇数になるように作ろうとしています、

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

public int t で 外から変数tの中身を見ているのですが、W,A.S.Dを押しているのにもかかわらず、値が増えない、値が変わった時は1づつ増えるのではなく3か4づつ増える、ということが起きています、特にエラーは出ていません

該当のソースコード

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.UI; 5 6public class Countdown : MonoBehaviour { 7 8 9 public int t = 0; 10 11 public Text text; 12 public int Gamestart = 1; 13 14 Transform A; 15 Transform B; 16 int a = 3; 17 18 // Start is called before the first frame update 19 void Start() { 20 21 var rotate = GetComponent<Rotate>(); 22 rotate.enabled = false; 23 24 Invoke("Countstart", 0.5f); 25 Invoke("Countstart", 1.5f); 26 Invoke("Countstart", 2.5f); 27 Invoke("Countstart", 3.5f); 28 Invoke("Countstart", 4.5f); 29 30 } 31 32 // Update is called once per frame 33 void Countstart() { 34 35 if (a == 3) { 36 text.text = "3"; 37 38 } 39 if (a == 2) { 40 text.text = "2"; 41 42 } 43 if (a == 1) { 44 45 text.text = "1"; 46 } 47 if (a == 0) { 48 text.text = "START"; 49 50 GameObject obj = GameObject.Find("startblock"); 51 Destroy(obj); 52 } 53 if (a == -1) { 54 text.text = ""; 55 56 57 58 Gamestart++; 59 } 60 a--; 61 62 63 64 65 } 66 private void Update() { 67 68 Invoke("Turn", 4.5f); 69 } 70 public void Turn() { 71 Quaternion quaternion = this.transform.rotation; 72 float y = quaternion.eulerAngles.y; 73 A = GameObject.Find("Acube").transform; 74 B = GameObject.Find("Bcube").transform; 75 Vector3 posA = A.position; 76 Vector3 posB = B.position; 77 78 79 if (t % 2 == 0) { 80 if (Input.GetKeyDown(KeyCode.W)) { 81 ++t ; 82 posB.z = posB.z++; 83 StartCoroutine(Rotation()); 84 Debug.Log("成功"); 85 86 } 87 if (Input.GetKeyDown(KeyCode.A)) { 88 t++; 89 posB.x = posB.x--; 90 StartCoroutine(Rotation()); 91 92 93 94 } 95 if (Input.GetKeyDown(KeyCode.S)) { 96 t++; 97 posB.z = posB.z--; 98 StartCoroutine(Rotation()); 99 100 101 } 102 if (Input.GetKeyDown(KeyCode.D)) { 103 t++; 104 posB.x = posB.x++; 105 StartCoroutine(Rotation()); 106 107 108 109 } 110 } else { 111 if (Input.GetKeyDown(KeyCode.W)) { 112 t++; 113 posA.z = posA.z--; 114 StartCoroutine(Rotation()); 115 116 117 } 118 if (Input.GetKeyDown(KeyCode.A)) { 119 t++; 120 posA.x = posA.x--; 121 StartCoroutine(Rotation()); 122 } 123 124 if (Input.GetKeyDown(KeyCode.S)) { 125 t++; 126 posA.z = posA.z++; 127 StartCoroutine(Rotation()); 128 129 130 } 131 if (Input.GetKeyDown(KeyCode.D)) { 132 t++; 133 posA.x = posA.x++; 134 StartCoroutine(Rotation()); 135 136 137 138 139 } 140 141 142 143 144 145 } 146 IEnumerator Rotation() { 147 for (var o = 0; o < 60; o++) { 148 yield return null; 149 } 150 151 var rotate = GetComponent<Rotate>(); 152 rotate.enabled = true; 153 154 for (var i = 0; i < 540; i++) { 155 yield return null; 156 } 157 rotate.enabled = false; 158 159 160 161 162 163 164 } 165 166 167 168 169 } 170}

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class Rotate : MonoBehaviour 6{ 7 int x; 8 // Start is called before the first frame update 9 void Start() 10 { 11 12 13 14 } 15 16 // Update is called once per frame 17 void Update() 18 { 19 20 transform.Rotate(new Vector3(0, 1/3f, 0)); 21 22 } 23} 24

試したこと

インターネットで調べてみましたが、同じような現象について書いてあるサイトは見つかりませんでした、間違えてこのスクリプトを何個かにつけているのではないかと思い、座標を表示してみましたが、そのようなことはなかったです、

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

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

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

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

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

guest

回答1

0

自己解決

おそらく、getkeydownの条件を満たし信号が送られる間に、複数回”turn"が実行されていたことが原因だと思います、Getkeydownの処理に遅延を作ると直りました

投稿2021/07/28 01:46

ymdhotnoa

総合スコア12

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

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

YAmaGNZ

2021/07/28 01:54

毎フレームTurnメソッドをInvokeしていますが必要なのですか? さらに遅延処理を作る必要が本当にあるのでしょうか?
ymdhotnoa

2021/07/28 11:16

カウントダウン中は駒を動かせないようにしたかったのでそれが終わるまでの4.5秒間は呼び出さないように、かつキーボードの条件文なのでUpdate内のInvokeで遅延をかけています、さらに遅延処理を作った理由は、ここでは説明しませんが、たまたまそこに遅延処理があると都合がよかったからです
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問