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

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

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

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

Unity

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

Q&A

解決済

2回答

604閲覧

(位置ゲー)コルーチン実行時、前回実行した際に取得した位置情報を現在の位置情報と同時に用いる方法

YA87

総合スコア6

C#

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

Unity

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

0グッド

0クリップ

投稿2022/11/14 17:14

前提

Unityでスマホ用位置ゲーを作っています。
その中で、コルーチンを用いて3秒ごとに端末の緯度経度から二点間の移動距離を算出して、目標距離から減算していく後述のような処理を書いています。
そこで毎回コルーチン実行時に端末位置を保持して、次回実行時に前回の端末位置(3秒前の端末の位置)と現在の端末位置を用いたいのですが、ループ時に前回の端末位置が上書きされてしまわないような書き方が分からないです。
また初回実行時は3秒前の端末位置に現在位置を代入する必要があると思うので、併せてその処理も知りたいです。
初心者ゆえ、分かりにくい文章かもしれませんが何卒よろしくお願いします。
あとこれはちょっとした疑問なのですが、位置情報を用いる場合コルーチンとUpdateメソッドで消費電力や負荷は大きく異なりますか?

実現したいこと

・毎回のコルーチン実行時の端末位置保持
・コルーチン実行時、前回実行時に保持した端末位置(3秒前の端末位置)と現在の端末位置を同時に用いる方法
・初回実行時のみ3秒前の端末位置に現在位置を代入する方法

該当のソースコード

C#

1public class Distance : MonoBehaviour 2{ 3 public UnityEngine.UI.Text text; 4 //目標距離までの残り距離 5 public int remainingDistance; 6 7 void Start() 8 { 9 Input.location.Start(); 10 remainingDistance = 1000; 11 StartCoroutine(GetDistance()); 12 } 13 14 private IEnumerator GetDistance() 15 { 16 while (true) 17 { 18 //端末の緯度経度 19 LocationInfo locationInfo = Input.location.lastData; 20 Location deviceLocation = new Location(locationInfo.latitude, locationInfo.longitude); 21 22 //距離(メートル)  引数の緯度経度から二点間の距離を求める処理 23 //Aの部分に前回コルーチン実行時の位置情報を代入したいです 24 int distance = (int)NaviMath.LatlngDistance(deviceLocation, A) * 1000; 25 26 this.remainingDistance -= distance; 27 //更新 28 text.text = string.Format("残り{0}m", this.remainingDistance); 29 //現在位置情報を保持する処理を書く 30 31 // 32 yield return new WaitForSeconds(3); 33 34 if(this.remainingDistance <= 0) 35 { 36 break; 37 } 38 } 39 40 } 41}

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

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

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

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

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

guest

回答2

0

ベストアンサー

こんな感じでどうでしょうか。テストはしていませんのであしからず。

少し気になったのは、distanceで求めた値は必ず+値なのか、-/+値なのかが気になりました。
-/+値なら問題ないのですが、かならず+値になるのであれば、目的地と逆方向に移動した場合も残り距離が減算されてしまうので、お節介かもしれませんが一応気を付けてください。

C#

1public class Distance : MonoBehaviour 2{ 3 public UnityEngine.UI.Text text; 4 //目標距離までの残り距離 5 public int remainingDistance; 6 7 //過去の位置を保持する値 8 private Location OldLocation; 9 10 void Start() 11 { 12 Input.location.Start(); 13 remainingDistance = 1000; 14 15 //初回のみ過去の位置を現在位置でスタートする 16 LocationInfo locationInfo = Input.location.lastData; 17 OldLocation = new Location(locationInfo.latitude, locationInfo.longitude); 18 19 StartCoroutine(GetDistance()); 20 } 21 22 private IEnumerator GetDistance() 23 { 24 while (true) 25 { 26 //端末の緯度経度 27 LocationInfo locationInfo = Input.location.lastData; 28 Location deviceLocation = new Location(locationInfo.latitude, locationInfo.longitude); 29 30 //距離(メートル)  引数の緯度経度から二点間の距離を求める処理 31 int distance = (int)NaviMath.LatlngDistance(deviceLocation, OldLocation) * 1000; 32 33 this.remainingDistance -= distance; 34 35 //過去の位置を更新する 36 OldLocation = deviceLocation; 37 //更新 38 text.text = string.Format("残り{0}m", this.remainingDistance); 39 40 yield return new WaitForSeconds(3); 41 42 if(this.remainingDistance <= 0) 43 { 44 break; 45 } 46 } 47 } 48} 49

投稿2022/11/15 00:41

Y0241-N

総合スコア1066

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

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

YA87

2022/11/15 04:35

回答ありがとうございます。コルーチンの更新について謎の勘違いしてたのが分かりました… それと今のところは目的地は設定せず、純粋に移動距離のみを利用しようと思っています。 なので極端な話同じ場所を往復する形でもいいのでdistanceの正負に関しては問題ないです。お気遣いありがとうございます。
guest

0

その前回の値ってのをグローバル変数とかクラス変数とかインスタンス変数に保存しとけばいいだけなんでは

投稿2022/11/14 22:42

y_waiwai

総合スコア87747

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

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

Zuishin

2022/11/15 11:48

教えるのはこれで何度目かわかりませんが、C# にグローバル変数はありません。 またこの場合、インスタンスが一つに制限されていないので、クラス変数を使うべきではありません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問