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

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

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

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

while

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

Unity

Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

解決済

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

YA87
YA87

総合スコア5

C#

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

while

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

Unity

Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

1回答

0グッド

0クリップ

204閲覧

投稿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ほど加算されてしまいました。こちらの原因は分かりませんでした。
実在地の緯度経度で試算を行った際にはおおよそ正確な値が出たので計算処理は間違っていないはずです。

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

回答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

総合スコア13048

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

YA87

2022/11/23 01:36

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

2022/11/23 01:41

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

2022/11/23 02:22

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

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

ただいまの回答率
86.12%

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

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

質問する

関連した質問

同じタグがついた質問を見る

C#

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

while

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

Unity

Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。