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

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

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

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

Unity

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

Q&A

解決済

2回答

2372閲覧

目的地に到達したらという処理を安定させたい

h212s228

総合スコア2

C#

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

Unity

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

0グッド

0クリップ

投稿2021/12/07 19:43

いつもお世話になっております。
rigidbodyを使用しないプレイヤーの挙動を制作しており、目的地に到達したときにMoveTowardsの移動を終了する処理で、Transform同士で比較するよりMathf.Approximatelyのほうが安定するっぽいのでそちらを使っていたのですが、それでも処理が安定しません。(Mathf.Approximatelyがtrueにならず再帰呼び出ししているコルーチンから抜け出せなくなっているっぽい)

目的地に到達したらという処理を安定させる方法があればご教授いただければ幸いです。

C#

1 2 3 /// <summary> 4 /// ImageMove 5 /// プレイヤーの画像を移動させる 6 /// </summary> 7 void ImageMove() 8 { 9 switch (playerAct) 10 { 11 12 case PlayerAct.Right: 13 targetPos = transform.position; // 初期化 14 targetPos.x = transform.position.x + 0.2f; // 移動先の位置を取得 15 ImageMoving(targetPos.x, transform.position.x); // プレイヤーの画像を動かす 16 break; 17 18 case PlayerAct.Left: 19 targetPos = transform.position; 20 targetPos.x = transform.position.x - 0.2f; 21 ImageMoving(targetPos.x, transform.position.x); 22 break; 23 24 case PlayerAct.Up: 25 targetPos = transform.position; 26 targetPos.y = transform.position.y + 0.2f; 27 ImageMoving(targetPos.y, transform.position.y); 28 break; 29 30 case PlayerAct.Down: 31 targetPos = transform.position; 32 targetPos.y = transform.position.y - 0.2f; 33 ImageMoving(targetPos.y, transform.position.y); 34 break; 35 } 36 } 37 38 /// <summary> 39 /// ImageMoving 40 /// 画像を移動させる 41 /// </summary> 42 /// <param name="target">移動先の座標</param> 43 /// <param name="cuurent">現在地点</param> 44 void ImageMoving(float target, float cuurent) 45 { 46 switch (playerAct) 47 { 48 case PlayerAct.Right: 49 StartCoroutine(nameof(MoveProcess)); // MoveTowadsを用いた移動処理 50 break; 51 52 case PlayerAct.Left: 53 StartCoroutine(nameof(MoveProcess)); 54 break; 55 56 case PlayerAct.Up: 57 StartCoroutine(nameof(MoveProcess)); 58 break; 59 60 case PlayerAct.Down: 61 StartCoroutine(nameof(MoveProcess)); 62 break; 63 64 default : 65 Debug.Log("error"); 66 break; 67 } 68 } 69 70 /// <summary> 71 /// MoveProcess 72 /// 移動の補間処理 73 /// </summary> 74 /// <returns></returns> 75 IEnumerator MoveProcess() 76 { 77 float dis = 0.01f * moveSpeed; // 補間の変数dis 78 transform.position = Vector3.MoveTowards(transform.position, targetPos, dis); // 移動の補間 79 80 float targetX = (float)Math.Round(targetPos.x, 1, MidpointRounding.AwayFromZero); // 少数第1で切り捨て 81 float targetY = (float)Math.Round(targetPos.y, 1, MidpointRounding.AwayFromZero); 82 float crPosX = (float)Math.Round(transform.position.x, 1, MidpointRounding.AwayFromZero); 83 float crPosY = (float)Math.Round(transform.position.y, 1, MidpointRounding.AwayFromZero); 84 85 if (Mathf.Approximately(crPosX, targetX)) // 目的地に到達したとき 86 { 87 if (Mathf.Approximately(crPosY, targetY)) 88 { 89 dis = 0; // 一応初期化 90 refreshFlag = true; 91 yield break; 92 } 93 } 94 95 StartCoroutine(nameof(MoveProcess)); // コルーチンの再起呼び出し 96 } 97

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

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

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

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

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

guest

回答2

0

ベストアンサー

これって座標みたいに厳密に判定する必要があるゲームでしょうか?

そうでないなら、2点間の距離からアプローチする方法もあるのかなと思いました。

※2点間の距離の出し方は
Vector2.Distance あるいは Vector3.Distance とかで計算できます。

例えばプレイヤーとゴール地点の距離を計算して、それが一定値以下であれば到着したとみなすみたいな処理とかでも到着したかどうかの判断はできるかなと思いました。(例えばゴールまで0.01の距離にいるなら、それってゴールにいるじゃん。みたいな考え方)

投稿2021/12/08 01:36

hogefugapiyo

総合スコア3302

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

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

0

安定させる方法、になるかどうかはわかりませんが、「目的地」なるオブジェクトを作って、それの当たり判定からcolliderなどを使って判定をしてみてはどうでしょうか。
オブジェクトを作っておけば、範囲指定や「ある特定の状態のときのみ作動させる」といったことができます。

投稿2021/12/07 23:34

thirca

総合スコア12

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問