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

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

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

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

Unity

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

Q&A

解決済

2回答

2804閲覧

Unity 座標の計算が合わない

pf0yukineko

総合スコア17

C#

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

Unity

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

0グッド

0クリップ

投稿2017/11/15 15:08

Unityでの質問です。
今、音ゲーの譜面作成モードのようなものを作っています。
そこで、クリックしてクリックしたところにノーツを生成、別のキーを押してクリックした場所のノーツを削除、そしてその生成したノーツをscvファイルを使ってセーブすることまではできました。今回はここまでは間違ってないということでお願いします。
そこでロードを実装しました。結果としてはセーブしたノーツを座標も同じで生成することができました。ですがノーツを消すことがある一定座標を過ぎるとできなくなってしまいます。
ノーツの削除は以下のような感じでクリックした座標(少しのずれを許容)とノーツのY座標を比較して同じだった場合削除します。

C#

1 if (Input.GetButton("Fire2")) 2 { 3 if (touchWorldPosition.x > -2.4f && touchWorldPosition.x < -1.2f) 4 { 5 for (i = 0; i < notes.Count; i++) 6 { 7 //-4.27fは一番下にノーツを置いたときのノーツの座標 8 //yposにはマウスでクリックしたy座標 9               //下イメージの縦1メモリが0.5f 10               //note[]には今生成されているノーツが入ってる 11 for (q = -4.27f; q <= ypos; q += 0.5f) { } 12 //Debug.Log() 13 if (notes[i].transform.position == new Vector3(-1.8f, q - 0.25f, 0)) 14 { 15 Destroy(notes[i]); 16 notes.RemoveAt(i); 17 savefile.RemoveAt(i); //Saveに使う 18 i = notes.Count + 1; 19 } 20 } 21 }

イメージ説明
詳しく書くと、例えばノーツの生成場所が(-1.8,293.48,0)だとしてDebug.Logでクリックしたy座標を調べて(-1.8,293.48)だったとしてもノーツが消えないです。大体全体のy座標250あたりから消えないようになります。処理が追い付いてないというわけでもなく単純に消えないです。ロードしても消えるノーツがあるだけに訳が分からないです。

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

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

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

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

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

guest

回答2

0

ベストアンサー

コードにマジックナンバーがありすぎて全体の処理がちょっとよく分からないですが、
おそらく、座標の比較部分で問題が起きているような気がします。

if (notes[i].transform.position == new Vector3(-1.8f, q - 0.25f, 0)) { }

の部分ですね。

float型を == で評価しても、誤差の問題で false 相当になってしまっているのではないかなと思います。

いったん、デバッガでここの処理でbreakしてみて、ちゃんとif文の中に処理が入るか確認してみてはどうでしょうか?

投稿2017/11/15 16:16

edo_m18

総合スコア2283

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

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

pf0yukineko

2017/11/16 14:37

指摘された部分の処理を表示させてみたら"false"となってました。そこで if (Math.Abs(notes[i].transform.position.y - q) < 0.4f) と書き直したところ自分の望んでいたようになりました。 今回はありがとうございました。
guest

0

たしかにedo_m18さんのご指摘は要確認ポイントかと思います。
一応、Vector3同士の比較は多少のズレを許すようになっているようですが、

C#

1public static bool operator ==(Vector3 lhs, Vector3 rhs) 2{ 3 return Vector3.SqrMagnitude(lhs - rhs) < 9.999999E-11; 4}

下記のようなケースでは、Debug.Logで座標を表示させても違いがないように見えるのに、比較するとFalseになってしまいました。

C#

1var v1 = new Vector3(-1.8f, 293.48f, 0.0f); 2var v2 = new Vector3(-1.8f, 293.48f + 0.00004f, 0.0f); 3 4Debug.Log(v1); // (-1.8, 293.5, 0.0) 5Debug.Log(v1.y); // 293.48 6Debug.Log(v2); // (-1.8, 293.5, 0.0) 7Debug.Log(v2.y); // 293.48 8 9Debug.Log(v1.y == v2.y); // False 10Debug.Log(Mathf.Approximately(v1.y, v2.y)); // True 11Debug.Log(Vector3.SqrMagnitude(v1 - v2)); // 9.313226E-10 12Debug.Log(v1 == v2); // False

投稿2017/11/15 21:28

Bongo

総合スコア10807

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

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

pf0yukineko

2017/11/16 14:40

詳しい解説ありがとうございました。プログラムの書き方など勉強になりました。お2人ともとてもわかりやすく親切でしたので、今回のBAは早く回答してくださった方にを譲りました。すみません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問