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

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

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

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

Unity

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

Q&A

解決済

3回答

3392閲覧

オブジェクトをテンポに合わせて正確を移動させたい

Carly7766

総合スコア33

C#

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

Unity

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

0グッド

0クリップ

投稿2018/11/11 22:17

編集2018/11/13 04:30

前提・実現したいこと

Unityで音ゲーを作っています。

前回の質問でオブジェクトをリストの順に動かすことができ、そこから音楽のテンポに合わせて等速で移動させられるようにここを参考に改良してみたのですが、メトロノームなどで測ると少しずつずれていることがわかりました。

具体的には、曲とオブジェクト移動を同じタイミングで行った時に、オブジェクトの移動が少しずつ遅れていきます。

また、一拍の秒数がfloatの桁数では足りなくなることがあります。
例:BPM105の曲の1拍の秒数
60 / 105 = 0.571428571428571
その対処法も教えてくださるとありがたいです。

該当のソースコード

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class MoveToPoints : CustomMonoBehaviour { 6 7 [SerializeField] 8 private List<Vector2> points; 9 10 [SerializeField] 11 private int BPM = 120; 12 13 private float totalTime; 14 15 [SerializeField] 16 private float offset; 17 18 int PrevPointIndex; 19 float startTime; 20 21 private void Start() 22 { 23 startTime = Time.timeSinceLevelLoad + offset; 24 25 //一拍の秒数 = 60 / テンポ 26 totalTime = 60f / (float)BPM; 27 } 28 29 protected void FixedUpdate() 30 { 31 var prevPoint = points[PrevPointIndex]; 32 var nextPoint = points[getIndex(PrevPointIndex)]; 33 34 35 var diff = Time.timeSinceLevelLoad - startTime; 36 var ratio = diff / totalTime; 37 38 var crntPos = Vector2.Lerp(prevPoint, nextPoint, ratio); 39 40 transform.position = crntPos; 41 42 if(ratio >= 1.0f) 43 { 44 startTime = Time.timeSinceLevelLoad; 45 PrevPointIndex = getIndex(PrevPointIndex); 46 } 47 } 48 49 int getIndex(int value) 50 { 51 return value < (points.Count - 1) ? (value + 1) : 0; 52 } 53}

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

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

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

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

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

MMashiro

2018/11/13 04:11

現在どのように音がずれているのでしょうか?(音が早く流れる・遅く流れる・不定期でずれる等々)
guest

回答3

0

ベストアンサー

ratio が 1.0以上になった時、ratioを『判定したタイミングで初期化』したりしています?

例えばratio = 1.04 の時に 『if(ratio >= 1.0f)』 を判定したとして、
そのままratioをそのタイミングで初期化してしまうと端数の0.04分、判定が遅くなります。
ノーツ毎に遅れる事になりますので、最終的には大幅に(と言える程かはわかりませんが)遅れることになります。
ratio の再計算結果に端数を加算してみてはどうでしょうか。

floatの桁数については全体で計算するしかないと思います。
例:BPM105の曲の1拍の秒数 : 60 / 105 = 0.571428571428571
例:BPM105の曲の2拍の秒数 : 60 * 2 / 105 = 1.142857142857142
例:BPM105の曲の3拍の秒数 : 60 * 3 / 105 = 1.714285714285714
見た感じでは誤差の範疇として切り捨ててしまっても良い気もしますが。

後、過去の回答を抜粋して載せておきます。以下、参考までに。

https://teratail.com/questions/108199 より ノーツを降らせる、とあるので 画面の上から下に流れてくるタイプのものと想定します。 ならば、 (現在のプレイ時間-対象のノーツがPerfect!になる時間)×1秒間に移動するY軸の距離+Perfect!になるY軸の位置 ↑これがY軸の値になると思います。 現在のプレイ時間を都度取得し、 Y軸も都度更新していけばノーツが降ってくるようになると思います。

投稿2018/11/13 05:28

torisan

総合スコア678

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

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

Carly7766

2018/11/15 08:54 編集

端数を加算する方法で無事に解決しました!! 協力してくれた皆さん、本当にありがとうございました!!
guest

0

音楽に合わせるなら、音楽の時間を用いて動かすのはどうでしょうか?
(audioSouce型変数).time
を用いれば、音楽とずれることはなくなると思います!

投稿2018/11/13 00:57

Wiz_Exmachina

総合スコア36

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

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

Carly7766

2018/11/13 01:28

すみません、音楽の"テンポ"に合わせてでした。質問の文章がわかりづらかったので修正しておきました。 そんなパラメータもあるのですね、テンポの計算に使ってみたいと思います。ありがとうございました
guest

0

ちょうど同じような質門のスレッドがありますんで、提示しておきます。
参考になるでしょうか

C# 秒間60回の処理を行うタイマーが思ったように動作しません。

投稿2018/11/11 22:43

y_waiwai

総合スコア87774

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

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

Carly7766

2018/11/12 10:44

ゲーム内の時間を元に移動したいので今回の場合には使えないかもです... ですがC#の勉強のとしてしっかり拝見させていただいます!!ありがとうございます!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問