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

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

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

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

Unity

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

Q&A

解決済

1回答

1906閲覧

リストに格納された座標に順に移動したい

Carly7766

総合スコア33

C#

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

Unity

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

0グッド

0クリップ

投稿2018/11/04 09:49

編集2018/11/07 07:27

前提・実現したいこと

Vector2のリストに格納された座標に順番に移動するプログラムを書いています。
どうしても素早く移動したりIndexOutRangeが出てうまくいきません。

該当のソースコード

csharp

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class MoveToPoints : MonoBehaviour { 6 public List<Vector2> points; 7 int pointIter; 8 float t; 9 public float speed = 0.5f; 10 11 private void FixedUpdate() { 12 pointIter = Mathf.Clamp(pointIter, 0, points.Count); 13 14 t = Time.time * speed; 15 16 transform.position = Vector3.Lerp(points[pointIter], points[pointIter + 1], t); 17 18 if(isArrival(points[pointIter + 1])) { 19 t = 0.0f; 20 pointIter++; 21 } 22 } 23 24 private bool isArrival(Vector2 point) { 25 return (Vector2)transform.position == point; 26 } 27} 28

試したこと

目的地に到達した時にtを0にせず
Mathf.Repeat()を使う

この方法では前の位置と次の位置を繰り返してしまいました。

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

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

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

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

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

guest

回答1

0

ベストアンサー

Vector3.Lerp

public static Vector3 Lerp (Vector3 a, Vector3 b, float t);
説明
直線上にある 2 つのベクトル間を補間します

t で a と b の間を補間します。t は、0-1 の範囲に固定されています。これは、直線状にあるポイント間(両端)で割合に対しての位置を取得するのに使用します(例えば徐々に目的地へ移動していくときに使用します)。

When t = 0 returns a. When t = 1 returns b. When t = 0.5 returns the point midway between a and b.

引用元: Vector3.Lerp - unity DOCUMENTATION

とあります。言い換えると、Vector3.Lerp(地点Aの位置, 地点Bの位置, AからBへの進み具合(0-1の値))というメソッドです。なので、距離: Time.time * speedを進み具合(割合)として渡すのは変ですよね。少なくとも((自地点と地点Aの距離) + Time.time * speed)/(地点Aと地点Bの距離)を進み具合(割合)として渡してあげるべきです。

######サンプルコード
※もっといい方法があるかもしれませんのでその点ご留意ください

Vector3にしてますが、Vector2に変えてもいけるかと。あと、Time.fixedDeltaTimeは必要に応じて変えて下さい。

(追記) インデックスの更新ミスってたので直しました。

c#

1using System.Collections.Generic; 2using UnityEngine; 3 4public class MoveToPoints : MonoBehaviour 5{ 6 public float Speed = 5f; 7 public List<Vector3> Points = new List<Vector3>() 8 { 9 new Vector3(0, 0, 0), 10 new Vector3(0, 0, 5), 11 new Vector3(5, 0, 0), 12 }; 13 int PrevPointIndex = 0; 14 15 private void FixedUpdate() 16 { 17 // ポイントを取得します 18 var prevPoint = Points[PrevPointIndex]; 19 var nextPoint = Points[(PrevPointIndex < (Points.Count - 1)) ? (PrevPointIndex + 1) : 0]; 20 21 // 位置を取得します 22 var prevPos = this.transform.position; 23 24 // 現在の位置を計算します 25 var ratio = (Vector3.Distance(prevPoint, prevPos) + Time.fixedDeltaTime * Speed) / Vector3.Distance(prevPoint, nextPoint); 26 var crntPos = Vector3.Lerp(prevPoint, nextPoint, ratio); 27 28 // 現在の位置に移動させます 29 transform.position = crntPos; 30 31 // ポイントのインデックスを更新します 32 if (ratio >= 1.0f) 33 { 34 PrevPointIndex = (PrevPointIndex < (Points.Count - 1)) ? (PrevPointIndex + 1) : 0; 35 } 36 } 37}

投稿2018/11/04 10:05

編集2018/11/04 11:01
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問