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

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

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

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

Unity

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

Q&A

2回答

6406閲覧

UnityでInput.GetKeyDown判定後の処理が遅延する

退会済みユーザー

退会済みユーザー

総合スコア0

C#

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

Unity

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

0グッド

1クリップ

投稿2016/12/26 10:32

編集2022/01/12 10:55

###前提・実現したいこと
Unity 5.5.0f3にて音楽ゲームを制作しているのですが、環境によってキー入力した後の動作に遅延が生じてしまうようです。具体的には、キー入力から5フレーム程度経過しないとサウンドが再生されない、音符を消す処理が始まらないなどの問題が発生するようです。

ゲームは処理落ちせずに動作しています。またサウンドの再生についてはコルーチンなどを使わず、確かにキー入力をしたのと同じUpdate内で呼び出すようになっています。

私の環境では、エディタ上でもビルドしても問題が起こりません。しかし少なくとも4人が全く同じ問題を訴えています。

問題の発生部分を簡略化したものが以下になります。

C#

1using UnityEngine; 2using UnityEngine.UI; 3 4public class InputTest : MonoBehaviour { 5 6 public Transform canvas; 7 public GameObject textPrefab; 8 public AudioSource source; 9 public AudioClip clip; 10 11 string[] keyName = new string[] {"q","w","e","r","t","y","u","i","o","p", 12 "a","s","d","f","g","h","j","k","l",";", 13 "z","x","c","v","b","n","m",",",".","/", 14 "space" }; 15 16 float[] keyPos = new float[] {-580,-460,-340,-220,-100, 20,140,260,380,500, 17 -540,-420,-300,-180, -60, 60,180,300,420,540, 18 -500,-380,-260,-140 ,-20,100,220,340,460,580, 19 0}; 20 21 int keyCount; 22 GameObject[] text; 23 Vector2 outer = new Vector2(-1000f, 0); 24 25 26 void Start () { 27 28 keyCount = keyName.Length; 29 if (keyCount != keyPos.Length) 30 { 31 gameObject.SetActive(false); 32 return; 33 } 34 35 text = new GameObject[keyCount]; 36 37 for (int i = 0; i < keyCount; i++) 38 { 39 text[i] = Instantiate(textPrefab); 40 text[i].transform.SetParent(canvas); 41 text[i].transform.localScale = Vector2.one; 42 text[i].transform.localPosition = outer; 43 text[i].GetComponent<Text>().text = keyName[i]; 44 } 45 46 } 47 48 49 void Update () { 50 51 for (int i = 0; i < keyCount; i++) 52 { 53 if (Input.GetKeyDown(keyName[i])) 54 { 55 text[i].transform.localPosition = Vector2.right * keyPos[i]; 56 source.PlayOneShot(clip); 57 } 58 if (Input.GetKeyUp(keyName[i])) 59 { 60 text[i].transform.localPosition = outer; 61 } 62 } 63 64 } 65 66}

この簡略化した処理も、実際のゲームで問題が発生した4人に試してもらいました。しかし、同じように5フレーム程度遅れてifブロック内の処理がされる場合がまだありました。

  • 2つ以上のキーを同時に押しても同時に問題が発生しています。
  • 処理の重さは関係ないようです。私より性能が良い環境でも問題が起こります。
  • ログを見せてもらってもエラーなどは発生していません。
  • フォーラムに同じような問題に関する投稿がありましたが、解決策は得られませんでした。

Unityに関して経験が浅く、初歩的なミスや設定が間違っているなどもあるかもしれません。考えられる可能性があれば、ご教授いただけると幸いです。

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

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

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

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

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

guest

回答2

0

まず「本当に遅延が発生しているのか」を確認したほうがいいと思います。
例えばCubeなどのオブジェクトを配置してそれのマテリアルの色を変えてみる、だとか。
もっと簡単に、 Debug.Log の出力タイミングを見てみるだとか。

そうした、「今回やろうとしていることとは無関係のこと」をやってみて、それでも遅延しますか?

ちなみに気になったのは、音の再生自体は音源を読み込むまでの時間がかかっているのではないかな、と思いました。
あとは、頻繁に音を鳴らすような処理の場合は、そもそも音の再生位置などを操作するだけで改めて読み込むような処理をやめてみるととでも改善するかもしれません。

音ゲーのようにタイミングがシビアなものはできるだけ遅延を減らすように処理を書いたほうがいいと思います。

とはいえ、なにはともあれ、まずは本当に遅延が発生しているのかどうかを、ごく簡単な処理で代替えしてみて確認してみてください。

投稿2016/12/26 14:47

edo_m18

総合スコア2283

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

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

0

別スレッドでキー入力を受け取って処理

投稿2016/12/26 12:35

otftrough

総合スコア476

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

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

退会済みユーザー

退会済みユーザー

2016/12/26 12:53 編集

ご回答ありがとうございます。Unityはシングルスレッドで動作し、無理やり別スレッドを作ったとしてもUnityのAPIを呼び出せないため解決できないという認識ですが、これは正しいでしょうか。 私がこの質問で最も疑問に思うのは、コルーチンもスレッドも使用していないのに、なぜフレームをまたいで遅延が発生する(ように見えている?)のかということです。キーボードなどハード側での問題も考えられるかもしれませんが。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問