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

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

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

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

Q&A

解決済

2回答

625閲覧

同時押しの時ノーツを横一列で実装する方法

tuna-uniko

総合スコア10

C#

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

0グッド

0クリップ

投稿2020/11/19 12:44

編集2020/11/20 07:43

音楽ゲーム制作の方で前々から実装できなくて困っていることがあります。
曲開始から1.3秒のタイミングで4つ同時押しのような、複数のボタンを同時に押す横並びのノーツ群を生成する時、現在使用しているスクリプトではfor**Update()**の中身で変数が+1されるまでのわずかな差によって、読み込み用のjsonファイル内では全く同じ数値なのに階段のようにずれてしまいます。
###使用コード

C#

1void Update(){ 2 time =trackon.GetComponent<AudioSource>().time; //曲開始からの時間 3 4 if (time >= eei[f]) //タイミングデータをもつ配列の要素と比較 5 { 6 //numを参照 7 GameObject nt; 8 switch (rea[f]) //レーン情報をもつ配列の要素を確認 9 { 10 case 0: 11 basyo = -2f; 12 break; 13 case 1: 14 basyo = -0.25f; 15 break; 16 case 2: 17 basyo = 1.5f; 18 break; 19 case 3: 20 basyo = 3.23f; 21 break; 22 case 4: 23 basyo = 4.98f; 24 break; 25 default: 26 basyo = 3.6f; 27 break; //ノーツ生成位置をレーン情報に合わせて設定 28 } 29 nt = Instantiate(mi,new Vector3(basyo, 5.7f, -0.2f),Quaternion.identity) as GameObject; 30 noteGo.Add(nt); //リスト化 31 f += 1; //次のノーツへ 32 } 33}

以上の書き方でノーツを生成していますが、この書き方だと前述の通り横一直線にならずずれた階段状で流れてきてしまいます。生成をレーン数に合わせて分割する方法では同様のまま、後続のノーツタイミングを確認するものに関してはノーツエディタなどを使用していない手打ちのため同時押しのつもりがずれていることもあり無理でした。特に3レーンと5レーンの場合が特に厄介で、階段状のずれが起きているせいで譜面認識がまともにできない状況です。

####実装したいこと
変数fの更新によって起こる生成のずれをなくし、同時押しの時は何個であっても全て横一列に並んで降ってくるようにするコードを実装したいです。

使用環境
Unity2019.1.5f1 VisualStudio
追記
ソース内の処理に関しての説明にて間違いの記述をしていたため、そちらを修正しました
(✕ for ◯ Update())                   2020.11.20

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2020/11/20 05:17

> forの中身で変数が+1されるまでのわずかな差によって 提示されているソースにfor文は見当たりませんが。関連するソースがあるならそれも載せてください。
tuna-uniko

2020/11/20 07:35

ご指摘ありがとうございます。ソースを見直したところforではなくupdate()にて行われていました。修正させていただきます。
guest

回答2

0

ベストアンサー

ようは、Updateが呼ばれたタイミングでノーツを1つしか処理しないから問題になっているという話ですよね?

ループを組んで、その時に処理しなくてはいけないノーツ情報を全部処理すればよろしいかと思います。

投稿2020/11/20 08:05

YAmaGNZ

総合スコア10288

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

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

tuna-uniko

2020/11/21 00:45

YAmaGNZ様 回答ありがとうございます。forループを組み後ろのノーツタイミングと一致しているかどうかチェックするようにし、一致している場合はfor内でノーツ情報をまとめて処理するようにしたところ、きちんと横一列に並んでくれるようになりました。一致していない場合はまだずれてしまうため、ノーツ同士のタイミングの差が一定値以下0以上の場合にこのfor文処理をするよう書き換えていきたいと思います。 回答していただきありがとうございました。
guest

0

外してるかもしれませんが、Update内でtimeを毎回取得しているのがまずいのでは。
Updateすべきオブジェクトが複数存在するとして、まずUpdate前にtimeを一回取得し、
それを基準時間として全てのオブジェクトをUpdateすればよいのではないでしょうか。

投稿2020/11/20 07:55

編集2020/11/20 07:56
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

tuna-uniko

2020/11/21 00:41

radian様 回答ありがとうございます。timeの方はStart()内で取得済みでしたが、Update()内の記述を消してしまうとノーツが非表示になってしまうバグを起こしてしまうことが確認されました。しかしスクリプトレファレンスの方ではUpdate()内で再度AudioSourece.timeを取得する書き方ではなかったので、私の組み方がどこかおかしいだけなのかもしれません。 回答していただきありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問