前提・実現したいこと
音ゲーを作ってみたいので、最初にメトロノームを作ることにしたのですが
毎回鳴って欲しいタイミングよりも5~15ms程度ずれてしまいこの差を殆ど埋める段階で詰まってしまいました。
Invokeを使ったとしても多少時間のずれは生じてしまうのでしょうか?
出力画面
0.512072 / *ring* 1.007742 / *ring* 1.509232 / *ring* ...
該当のソースコード
マジックナンバーやhumenの取り出し方が甘いのはテスト用なので許してください。
C#
1private int[,] humen = { 2 { 1,1,1,1 }, 3 { 1,1,1,1 }, 4 { 1,1,1,1 }, 5 { 1,1,1,1 }, 6 { 1,1,1,1 }, 7 { 1,1,1,1 } 8 }; 9 10 public AudioSource ringSE; 11 private int bpm = 120; 12 private float beatInterval; // 1拍の長さ 13 private int beatCnt = 0; 14 15 private void Start() 16 { 17 // 1拍の長さを求めるには 60 / bpm で求められる 18 beatInterval = 60f / bpm; 19 // 1拍毎に音を鳴らすべきかチェックする 20 InvokeRepeating("RingCall", beatInterval, beatInterval); 21 } 22 23 private void RingCall() 24 { 25 // 次の拍にあたるデータが1なら音を鳴らす 26 if(humen[beatCnt / 4, beatCnt % 4] == 1) 27 { 28 ringSE.Play(); 29 Debug.Log(Time.time + " / *ring*"); 30 } 31 else 32 { 33 Debug.Log(Time.time); 34 } 35 beatCnt++; 36 }
試したこと
音を鳴らすタイミングをクールタイムで管理し、経過時間をUpdate内でTime.deltaTimeで計測
→さらにずれが悪化しました。
void Update() { if(callRemainTime < 0) { ringSE.Play(); Debug.Log(Time.time); callRenainTime = beatInterval; } callRemainTime -= Time.deltaTime; }
コルーチンを使い、無限ループの中で一定時間待機させ関数呼び出し
→Invokeを使った時とさほど変わりませんでした。
IEnumerator LoopCall() { while (true) { yield return new WaitForSeconds(beatInterval); ringSE.Play(); Debug.Log(Time.time); } }
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/03/14 05:19