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

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

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

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

Q&A

解決済

2回答

5837閲覧

オブジェクトのパスに沿った移動とパスの可視化

hogehoge23

総合スコア14

Unity

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

0グッド

1クリップ

投稿2020/04/11 03:37

お世話になっております。
トップダウンのメタルギアみたいなゲームを作ろうと思っているのですが、警備兵が特定のポイントを特定のルートで移動する巡回機能を作ろうと思っています。

#やりたいこと
イメージ説明
Lucky looterというアプリなのですが、やりたいことのイメージはこれが近いです。
地面に描かれた紫の丸が移動ポイントで、それをつなぐ線が移動経路と可視化されています。

決まったルートを巡回させるためにどうしようか悩んでいたのですが、CinemachineのDolly Cartを使うとエディタ上からベジェ曲線でルートを決めてその上を自由に動かすことができたので一旦それで対応しました。

イメージ説明
※ CinemachineのDolly Cartにカプセルくんを乗せてパス上を動かすサンプル

→ 参考
【Unity】Timelineで、指定したパスを想定した速度で歩かせるhttp://tsubakit1.hateblo.jp/entry/2018/08/28/014946

ただ、これだとエディタ上ではギズモでルートが可視化されているのでわかりやすいですが実際のシーン上だとルートが可視化されていないので警備兵の巡回ルートを巡回するルート通りに可視化したいと頭を悩ませています。

LineRendererで座標をつなげれば良いかとも思ったのですが、実際に通る位置とLineRendererの位置がズレてしまったのでこのアプローチは違うのかなと一旦やめました。

イメージ説明
※ CinemachineSmoothPathのWaypoint情報を取得してLineRendererでつなぐと、単純に直線でつないでしまうからルートとあわなくなる

最初の画像のように移動ルートを可視化し、なおかつキャラクターはその可視化されたパス通りに動かすにはどういったアプローチが考えられますでしょうか? ヒントなどをいただければ幸いです

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

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

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

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

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

guest

回答2

0

ベストアンサー

Cinemachineを使う方針で行くとしたら、ドリートラック可視化用のLineRendererのコーナー数をパスのウェイポイント数よりも多く取って、もっと細かい折れ線で近似してやればよさそうに思います。
パス上の位置はEvaluatePositionで得られるんじゃないでしょうか?
一例として、ドリートラックに下記のようなスクリプトをアタッチしてみてはいかがでしょう。

C#

1using Cinemachine; 2using UnityEngine; 3 4[RequireComponent(typeof(LineRenderer), typeof(CinemachinePathBase))] 5[ExecuteAlways] 6public class LineUpdater : MonoBehaviour 7{ 8 [Range(1, 8)] public int tessellation; 9 private CinemachinePathBase path; 10 private LineRenderer line; 11 12 private void Update() 13 { 14 if (this.path == null) 15 { 16 this.path = this.GetComponent<CinemachinePathBase>(); 17 } 18 19 if (this.line == null) 20 { 21 this.line = this.GetComponent<LineRenderer>(); 22 } 23 24 this.tessellation = Mathf.Max(this.tessellation, 1); 25 var step = 1.0f / this.tessellation; 26 var positionCount = ((int)(this.path.MaxPos - this.path.MinPos) * this.tessellation) + 1; 27 this.line.positionCount = positionCount; 28 for (var i = 0; i < positionCount; i++) 29 { 30 this.line.SetPosition(i, this.path.EvaluatePosition(i * step)); 31 } 32 } 33}

図

投稿2020/04/13 15:53

Bongo

総合スコア10807

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

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

hogehoge23

2020/04/18 02:53

お返事が遅くなり申し訳ありません。 まさに求めていた挙動が実現できました。ありがとうございます。
guest

0

DOTweenProのDOTweenPathなら、
シーンビューで移動ルートを設定でき、スピードも調整できて、
進行方向に体を向けたりもできます。
https://assetstore.unity.com/packages/tools/visual-scripting/dotween-pro-32416

また、キャラが直線的に動いてもいいなら
PathTypeをリニアにすればベジエ曲線ではなく直線の経路になるので、

c#

1 DOTweenPath dotween = GetComponent<DOTweenPath>(); 2 var path = dotween.wps; 3 foreach (var p in path) print(transform.TransformPoint(p));

このようなスクリプトで座標のリストを取得できるので、
LineRendererでつなげば移動経路どおりにルートを可視化できます。

ちなみに無料版のDOTweenだとシーンビューでルートを作れませんが同じことができます。

投稿2020/04/11 05:49

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問