###前提・実現したいこと
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に関して経験が浅く、初歩的なミスや設定が間違っているなどもあるかもしれません。考えられる可能性があれば、ご教授いただけると幸いです。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。