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

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

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

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

Unity

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

Q&A

解決済

1回答

8447閲覧

Unityでコントローラーからの入力が反応しない時があるのは何故か

.com

総合スコア8

C#

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

Unity

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

0グッド

0クリップ

投稿2021/04/17 15:49

前提・実現したいこと

Unityでコントローラーから入力をしてプレイヤーを動かしたり、色々な処理をさせているのですが、入力が反映されない(反応しない)時があります。それも3回に1回反応するかしないかくらいです。
コードの書き方が悪いのか、コントローラーが悪いのか、別の問題なのか分からないので教えてほしいです。

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

コントローラーの入力が反応しない時がある

該当のソースコード

入力が反応しない時があるコードです。他にも反応しない時があるコードはありますが一例としてこれを置いておきます。

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class ClockAnimation : MonoBehaviour 6{ 7 // Animatorを入れる変数 8 private Animator animator; 9 float time= 0.0f; 10 int i = 0; 11 float state = 0; 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 Play(); 23 } 24 25 void FixedUpdate() 26 { 27 // 1秒ごとに数える 28 //Nowtime -= Time.deltaTime; 29 30 if (Input.GetKeyDown("joystick button 0")) 31 { 32 ClockCase(); 33 //TakeButton(); 34 } 35 } 36 37 // 時間を測る 38 void Timer() 39 { 40 state += 1; 41 time = state; 42 } 43 44 public void ClockCase() 45 { 46 switch(state) 47 { 48 case 0: // 残り10秒 49 break; 50 case 1: // 残り9秒 51 break; 52 case 2: // 残り8秒 53 break; 54 case 3: // 残り7秒 55 break; 56 case 4: // 残り6秒 57 break; 58 case 5: // 残り5秒 59 Reverse(); 60 Invoke("Play", 1f); 61 state = 5; 62 time = 5; 63 break; 64 case 6: // 残り4秒 65 Reverse(); 66 Invoke("Play", 2f); 67 state = 4; 68 time = 4; 69 break; 70 case 7: // 残り3秒 71 Reverse(); 72 Invoke("Play", 4f); 73 state = 3; 74 time = 3; 75 break; 76 case 8: // 残り2秒 77 Reverse(); 78 Invoke("Play", 6f); 79 state = 2; 80 time = 2; 81 break; 82 case 9: // 残り1秒 83 Reverse(); 84 Invoke("Play", 8f); 85 state = 1; 86 time = 1; 87 break; 88 case 10: // 残り0秒 89 state = 10; // これでゲームオーバーなので10を入れる 90 time = 10; 91 break; 92 default: 93 break; 94 } 95 } 96 97 // 再生 98 public void Play() 99 { 100 animator.SetFloat("speed", 1.0f); 101 } 102 103 // 一時停止 104 public void Pause() 105 { 106 animator.SetFloat("speed", 0.0f); 107 } 108 109 // 逆再生 110 public void Reverse() 111 { 112 animator.SetFloat(Animator.StringToHash("speed"), -1); 113 } 114} 115

試したこと

・InputManagerを変更してみる。(色々サイトを見ながら変更しています)
・プレイヤーの入力↓はしっかり動いています。(ジャンプとか移動とか)

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class PlayerController : MonoBehaviour 6{ 7 // Rigidbodyを変数に入れる 8 Rigidbody rb; 9 // 移動スピード 10 public float f_Speed = 30.0f; 11 // ジャンプ力 12 public float f_JumpForce = 400.0f; 13 // Animatorを入れる変数 14 private Animator animator; 15 // プレイヤーの位置を入れる 16 Vector3 v_PlayerPos; 17 // プレイヤーの回転を入れる 18 Vector3 v_Rotation; 19 // 地面に接触しているか否か 20 bool b_Ground = true; 21 int n_Key = 0; 22 23 string state; 24 string prevState; 25 26 void Start() 27 { 28 // Rigidbodyを取得 29 rb = GetComponent<Rigidbody>(); 30 // プレイヤーのAnimatorにアクセスする 31 animator = GetComponent<Animator>(); 32 // プレイヤーの現在より少し前の位置を保存 33 v_PlayerPos = transform.position; 34 } 35 36 void Update() 37 { 38 GetInputKey(); 39 ChangeState(); 40 ChangeAnimation(); 41 Move(); 42 } 43 44 void OnCollisionEnter(Collision col) 45 { 46 if (col.gameObject.tag == "Ground") 47 { 48 // 地面に付いていないときは飛べないようにする 49 if (!b_Ground) 50 b_Ground = true; 51 } 52 } 53 54 void GetInputKey() 55 { 56 // A・Dキー、←→キーで横移動 57 float x = Input.GetAxisRaw("Horizontal") * Time.deltaTime * f_Speed; 58 59 if (Input.GetKey(KeyCode.RightArrow)) 60 { 61 n_Key = 1; 62 state = "RUN"; 63 } 64 65 if (Input.GetKey(KeyCode.LeftArrow)) 66 { 67 n_Key = -1; 68 state = "RUN"; 69 } 70 else 71 { 72 state = "IDLE"; 73 } 74 } 75 76 // プレイヤーの状態を変える 77 void ChangeState() 78 { 79 if (b_Ground) 80 { 81 if (n_Key != 0) 82 { 83 state = "RUN"; 84 } 85 else 86 { 87 state = "IDLE"; 88 } 89 } 90 else 91 { 92 state = "JUMP"; 93 } 94 } 95 96 // プレイヤーのアニメーションを変える 97 void ChangeAnimation() 98 { 99 if (prevState != state) 100 { 101 switch (state) 102 { 103 case "JUMP": 104 animator.SetTrigger("Jump"); 105 break; 106 case "RUN": 107 animator.SetFloat("Run", 1.0f); 108 break; 109 default: 110 break; 111 } 112 prevState = state; 113 } 114 } 115 116 // 動き 117 void Move() 118 { 119 if (b_Ground) 120 { 121 if (Input.GetKeyDown("joystick button 2")) 122 { 123 //jumpForceの分だけ上方に力がかかる 124 rb.AddForce(transform.up * f_JumpForce); 125 state = "JUMP"; 126 b_Ground = false; 127 } 128 } 129 130 // 現在の位置+入力した数値の場所に移動する 131 rb.MovePosition(transform.position + new Vector3(Input.GetAxisRaw("Horizontal") * Time.deltaTime * f_Speed, 0, 0)); 132 133 // 最新の位置から少し前の位置を引いて方向を割り出す 134 Vector3 direction = transform.position - v_PlayerPos; 135 136 // 移動距離が少しでもあった場合に方向転換 137 if (direction.magnitude >= 0.01f) 138 { 139 //directionのX軸とZ軸の方向を向かせる 140 transform.rotation = Quaternion.LookRotation(new Vector3(direction.x, 0, direction.z)); 141 } 142 else 143 { 144 n_Key = 0; 145 } 146 147 //プレイヤーの位置を更新する 148 v_PlayerPos = transform.position; 149 } 150}

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

Unityのバージョン:2020.2.0b2.3094 Personal
使っているコントローラー:https://www.elecom.co.jp/products/JC-U3613MBK.html

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

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

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

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

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

guest

回答1

0

ベストアンサー

FixedUpdateでGetKeyDownやGetKeyUpは呼ばないほうがいいです。
詳しくはこちらの記事を参照してください。

投稿2021/04/18 02:26

f-rank

総合スコア132

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

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

.com

2021/04/18 02:35

ありがとうございます。Updateじゃないとinputは正常に動かないんですね。知りませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問