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

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

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

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

Unity

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

解決済

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

h212s228
h212s228

総合スコア2

C#

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

Unity

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

2回答

0評価

0クリップ

178閲覧

投稿2021/12/07 19:43

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

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

C#

/// <summary> /// ImageMove /// プレイヤーの画像を移動させる /// </summary> void ImageMove() { switch (playerAct) { case PlayerAct.Right: targetPos = transform.position; // 初期化 targetPos.x = transform.position.x + 0.2f; // 移動先の位置を取得 ImageMoving(targetPos.x, transform.position.x); // プレイヤーの画像を動かす break; case PlayerAct.Left: targetPos = transform.position; targetPos.x = transform.position.x - 0.2f; ImageMoving(targetPos.x, transform.position.x); break; case PlayerAct.Up: targetPos = transform.position; targetPos.y = transform.position.y + 0.2f; ImageMoving(targetPos.y, transform.position.y); break; case PlayerAct.Down: targetPos = transform.position; targetPos.y = transform.position.y - 0.2f; ImageMoving(targetPos.y, transform.position.y); break; } } /// <summary> /// ImageMoving /// 画像を移動させる /// </summary> /// <param name="target">移動先の座標</param> /// <param name="cuurent">現在地点</param> void ImageMoving(float target, float cuurent) { switch (playerAct) { case PlayerAct.Right: StartCoroutine(nameof(MoveProcess)); // MoveTowadsを用いた移動処理 break; case PlayerAct.Left: StartCoroutine(nameof(MoveProcess)); break; case PlayerAct.Up: StartCoroutine(nameof(MoveProcess)); break; case PlayerAct.Down: StartCoroutine(nameof(MoveProcess)); break; default : Debug.Log("error"); break; } } /// <summary> /// MoveProcess /// 移動の補間処理 /// </summary> /// <returns></returns> IEnumerator MoveProcess() { float dis = 0.01f * moveSpeed; // 補間の変数dis transform.position = Vector3.MoveTowards(transform.position, targetPos, dis); // 移動の補間 float targetX = (float)Math.Round(targetPos.x, 1, MidpointRounding.AwayFromZero); // 少数第1で切り捨て float targetY = (float)Math.Round(targetPos.y, 1, MidpointRounding.AwayFromZero); float crPosX = (float)Math.Round(transform.position.x, 1, MidpointRounding.AwayFromZero); float crPosY = (float)Math.Round(transform.position.y, 1, MidpointRounding.AwayFromZero); if (Mathf.Approximately(crPosX, targetX)) // 目的地に到達したとき { if (Mathf.Approximately(crPosY, targetY)) { dis = 0; // 一応初期化 refreshFlag = true; yield break; } } StartCoroutine(nameof(MoveProcess)); // コルーチンの再起呼び出し }

良い質問の評価を上げる

以下のような質問は評価を上げましょう

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

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

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

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

C#

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

Unity

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