teratail header banner
teratail header banner
質問するログイン新規登録

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

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

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

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

Unity

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

Q&A

1回答

1455閲覧

unityでの音楽ゲーム制作でノーツ(タップタイミング)がずれてしまう

calst

総合スコア0

C#

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

Unity

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

0グッド

2クリップ

投稿2023/07/09 05:24

0

2

実現したいこと

音楽ゲームにおけるノーツ(タップしなければならないタイミング)が正確なタイミングで生成されない。

前提

Unityにて音楽ゲームを制作中です。
音楽ゲームというゲームの仕様上、タップするタイミングを示すオブジェクト(以下ノーツ)が正確なタイミングで生成されなければならないのですが、時間がたつにつれ少しずつ遅れてしまいます。
以下詳細情報です。

発生している問題

ゲームを開始してから時間がたつにつれてノーツの生成が遅れてしまう。

該当のソースコード

C#

1 async UniTask ScorePlay() 2 { 3 GameObject g; 4 var leng = NowScore.ScoreDatas.Split(',')[0].Length; 5 var beatcount = 0; 6 foreach (var note in NowScore.ScoreDatas) 7 { 8 switch (note) 9 { 10 case '0': 11 break; 12 case '1': 13 case '2': 14 case '3': 15 case '4': 16 var direction = (DirectionList)note - '0'; 17 g = Instantiate(Enemy, SpawnPoint[direction], SpawnRotation[direction], EnemyRoot); 18 g.GetComponent<Enemy>().Init(this, EnemySpead, direction); 19 break; 20 case ',': 21 beatcount++; 22 leng = NowScore.ScoreDatas.Split(',')[beatcount].Length; 23 continue; 24 default: 25 continue; 26 27 } 28 await UniTask.Delay((int)(Mathf.Floor((60 / NowScore.BPM) * 4 * 1000 / leng)), delayTiming: PlayerLoopTiming.FixedUpdate); 29 if (!PlayingFlug) break; 30 } 31 Player.GameOver(true); 32 }

試したこと

  • Unitask.DelayのdelayTimingをFixedUpdateにしてFixed TimeStepを0.001に変更=>曲の序盤は改善されたが曲の終盤にはずれてしまう
  • 待機時間の小数点以下を蓄積させ一定値たまったら待機時間に加えるように修正=>改善するどころか余計に遅れてしまう
  • foreach内の遅延時間を計測し遅延時間分だけ待機時間から減算=>変化なし

自分で調べたサイト

【Unity】音ゲー制作で曲とテンポずれてしまう

Unityで音ゲーを作った!!(アルゴリズムとソース付き)

【続編!】音ゲーって作れるの?2

上記3サイト様を拝見させていただきましたが、今回の問題とは異なるように感じました。

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

Unity 2021.3.12f
VisalStudio2022

拙い文章かと思いますが、何卒ご指導ご鞭撻のほどよろしくお願いします。

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

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

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

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

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

guest

回答1

0

リンク先見てませんが、ソースを見て思ったことを書きます。自分も音ゲー作っています。

  • 次のイベントまでの時間を計算するときに待機時間を丸めても(Mathf.floor)大丈夫なんですか?
  • そもそも再生している曲の現在時間を見ないと処理と音楽は同期することは不可能なんじゃないでしょうか。ソースを見る限り音楽の再生と同時にこのメソッドをコールして、再生時間が10BPM時にオブジェクトを出現させたかったとしたら、UniTaskDelayで10BPM分待機してタイミングぴったしにオブジェクト生成をしたいっていう処理に見えます。もしそうだとしたら時間軸が違うので無理があります。音楽時間(AudioSource.time)を参照するか、高い分解能の音楽時間(AudioSettings.dspTime)を参照するようにしないといけません。
  • 音ゲーはラグがあると支障をきたすのは想像に容易いかと思います。なのでInstantiateとかSplitとか、メモリアロケーションを伴うコードはプレイ中の処理からは排除しましょう。

投稿2023/08/02 15:01

tomop

総合スコア14

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問