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

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

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

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

while

Whileは多くの言語で使われるコントロール構造であり、特定の条件が満たされる限り一連の命令を繰り返し実行します。

Unity

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

Q&A

解決済

1回答

329閲覧

(位置ゲー)コルーチンのwhile内部で、前回処理の最後に変数へ代入した位置情報が上書きされてしまう。

YA87

総合スコア6

C#

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

while

Whileは多くの言語で使われるコントロール構造であり、特定の条件が満たされる限り一連の命令を繰り返し実行します。

Unity

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

0グッド

0クリップ

投稿2022/11/22 19:19

前提

UnityでiPhone用の位置情報アプリを作成しています。
後述のコルーチンで3秒ごとの移動距離を取得したく色々試したのですが、うまくいきません。

実現したいこと

・コルーチンで3秒ごとに端末緯度経度を用いて移動距離を算出したい。
・while内で新しく位置情報を取得した際にoldLocationが上書きされないようにしたい。

発生している問題・エラーメッセージ

・恐らくwhile内下部でoldLocationを更新した後、whileループの最初に戻ってから3秒後に現在の端末位置を更新した際に、計算処理を行う前にoldLocationも上書きされてしまっているのだと思います。
計算処理を行なっても移動距離が0mになってしまっています。

該当のソースコード

c#

1 2//目標距離までの残り距離 3public static int remainingDistance = 1000; 4//前回while処理時の位置情報 5private Location oldLocation; 6 7〜中略〜 8 9private IEnumerator GetDistance() 10 { 11 var cachedWait = new WaitForSeconds(3); 12 13 LocationInfo locationInfo = Input.location.lastData; 14 15 oldLocation = new Location(locationInfo.latitude, locationInfo.longitude); 16 //実機テスト用デバッグテキスト 17 debug1.text = string.Format("3秒前緯度{0},経度{1}", oldLocation.Latitude, oldLocation.Longitude); 18 19 while (remainingDistance >= 0) 20 { 21 yield return cachedWait; 22 23 LocationInfo locationInfo1 = Input.location.lastData; 24 //現在の端末の緯度経度 25 Location deviceLocation = new Location(locationInfo1.latitude, locationInfo1.longitude); 26 27 debug2.text = string.Format("現在緯度{0},経度{1}", deviceLocation.Latitude, deviceLocation.Longitude); 28 29 //移動距離(メートル) 二点間の緯度経度から距離を計算する処理 30 int distance = (int)NaviMath.LatlngDistance(deviceLocation, oldLocation) * 1000; 31 32 text2.text = string.Format("{0}", distance); 33 34 remainingDistance -= distance; 35 36 text.text = string.Format("残り{0}m", remainingDistance); 37 //更新 38 oldLocation = deviceLocation; 39 40 } 41 42 //ここは無視してください 43 text2.text = string.Format(""); 44 arrivalpanel.SetActive(true); 45 yield break; 46 47 }

試したこと

試しにstartメソッド内でInput.location.lastDataを使ってoldLocationに端末位置を代入したら、処理一回で移動距離に1400万mほど加算されてしまいました。こちらの原因は分かりませんでした。
実在地の緯度経度で試算を行った際にはおおよそ正確な値が出たので計算処理は間違っていないはずです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

上書き云々よりも
キャストと乗算はキャストのほうが優先順位が高いです

例えば(int)0.5*1000は0です、500ではありません

c#

1int distance = (int)(NaviMath.LatlngDistance(deviceLocation, oldLocation) * 1000);

投稿2022/11/23 00:38

編集2022/11/23 00:57
ozwk

総合スコア13521

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

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

YA87

2022/11/23 01:36

回答ありがとうございます。 ここ数日間のモヤモヤが解消しました。本当に助かります。
ozwk

2022/11/23 01:41

oldLocationが上書きされているという仮説を立てたところまでは素晴らしいので 次は仮説を検証してみましょう
YA87

2022/11/23 02:22

今思えばdeviceLocationを取得した後、計算を行う前に一度yield returnで中断などすればテキストの挙動から本当に上書きされているのかが確認できたかもしれません… 今回は指摘いただいた箇所を、もともとのdouble型で計算してからint型へ変換するよう書き換えた結果、想像していた処理を実装することができました。 今後は検証もしっかり行うよう心掛けます。回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問