抽象的なタイトルで申し訳ありません。
Unityのルートの軌跡を描くようなプログラムを作っているのですが、実行結果に違和感のようなものがあります。
軌跡の描画にはLineRendererを使っているのですが、線が掠れてしまったり、始点の切り替えが出来なかったりします。
上記方法を解決するには、
LineRendelerの使い方に誤りがあるのか、
そもそも別のコンポーネントや方法を取るべきなのか判断できません。
ざっくりした内容で申し訳ございませんが、何か良い方法があればご教示頂きたいです。
当初の仕様仕様
プレイヤー(添付した動画の緑カプセル)の移動に合わせて、LineRendererで軌跡を描きます。
チェックポイント(添付した動画の黄色玉)まで移動すると、LineRendererの始点がチェックポイントに代わります。
イメージとしては一本線で描きます。
プレイヤーは手動操作ではなく、あらかじめ決めたルートを自動で移動します。
実際に実行した時の挙動。
実際に動かしたときの挙動をキャプチャしたものをyoutubeにアップしました。
実際の挙動をキャプチャしたもの
問題点
最終的には、正しい線になるのですが、途中の表示が想定とは違う挙動をします。
添付したyoutubeの動画をご覧いただけると幸いですが、下記の問題が生じます。
- 一番最初の点からのプレイヤーまで常に繋がった状態になってしまう。
- チェックポイントを通過すると、始点が変わってしまう。
- 途中で線が消えかけてしまう
結果画面
実際のソース
質問用に一部調整していますが、ほぼ、同じような構成です。
後述しますが、キーやボタン等でdoMovenment
を実行することで動きます。
チェックポイント間の移動はDOTweenというアセットを使って制御しています。
USERクラス
チェックポイント
cs
1class point { 2 public int Index; 3 public Vector3 Postion; 4 5 public point ( 6 int index; 7 Vector3 position; 8 ){ 9 Index = index; 10 Postion = position; 11 } 12}
実行するスクリプト
プレイヤーのオブジェクトに追加します。
cs
1class routeing { 2 public GameObject Walker; // プレイヤー自体にオブジェクト 3 4 public Point[] Points = new Points[]{ 5 new Point(1, new Vector3(座標情報)), 6 new Point(2, new Vector3(座標情報)), 7 new Point(3, new Vector3(座標情報)), 8 ... 9 new Point(9, new Vector3(座標情報)), 10 } 11 12 public LineRenderer _LineRenderer // 13 public int LineNumber = 0; // LineRenderer.SetPositionで指定するindex 14 15 public void doMovenment() 16 { 17 18 // 初期設定 19 _LineRenderer.positionCount = Points.Length + 1; 20 _LineRenderer.SetPosition(LineNumber, Points[0].transform.position); 21 LineNumber++; 22 23 // 自動的に実行する処理 24 Sequence sequence = DOTween.Sequence(); 25 26 for (int i = 1; i < Points.Length; i++) 27 { 28 sequence.SetDelay(Delay); 29 30 sequence.Append( 31 DOTween.To( 32 () => Walker.transform.position, 33 v => 34 { 35 Walker.transform.position = v; 36 _LineRenderer.SetPosition( 37 LineNumber, Walker.transform.position); 38 }, 39 Points[i].TeacherObject.transform.position, 40 Verocity 41 ) 42 ).AppendCallback(() => 43 { 44 LineNumber++; 45 }); 46 } 47 48 // 最後までルートを通り終わったら開始地点に戻る 49 sequence.SetDelay(Delay); 50 sequence.Append( 51 DOTween.To( 52 () => Walker.transform.position, 53 v => 54 { 55 Walker.transform.position = v; 56 }, 57 Points[0].TeacherObject.transform.position, 58 Verocity 59 ) 60 ); 61 } 62} 63
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/10/01 11:35
2018/10/01 15:32