Как я могу создать массив путевых точек области местности?

#c# #unity3d

#c# #unity3d

Вопрос:

У меня есть несколько летающих объектов, и мне нужно указать им несколько путевых точек. Я хочу, чтобы они летали по всей области местности в свободном стиле.

Возможно ли это сделать с путевыми точками?

На скриншоте в главном инспекторе камеры в скрипте Main.cs у меня есть точки экземпляра размером 1 с элементом 0. Элемент находится в иерархии InstancePoint. В InstancePoint у меня есть трассировка скрипта, которая получает путевые точки.

В этих путевых точках объекты должны перемещаться между ними. Теперь размер путевых точек равен 0, интересно, возможно ли создать некоторые игровые объекты в качестве путевых точек, которые будут областью местности, чтобы объект летал по области местности, но в свободном стиле, а не только между 3-4 путевыми точками? Или, может быть, логика должна быть чем-то другим вообще без путевых точек?

Скриншот

Это сценарий трассировки:

 using System;
using UnityEngine;
using System.Collections.Generic;
using System.Text.RegularExpressions;
using System.Linq;

public class Trace: MonoBehaviour
{
  public Material normalState;
  public Material activeState;

  public WayPoint[] wayPoints;
  private WayPoint curWP = null;


  public void Start()
  {
    foreach( var wp in wayPoints )
      SetTrigger(wp, false);

    if( wayPoints.Length > 0 )
    {
      curWP = wayPoints[0];
      SetTrigger( curWP, true );
    }
  }

  void SetTrigger( WayPoint wp, bool value )
  {
    wp.GetComponent<Collider>().isTrigger = value;
    wp.GetComponent<Renderer>().material = value ? activeState : normalState;
  }

#if UNITY_EDITOR
  [UnityEditor.MenuItem ("GameEditor/Collect route from priority of waypoints")]
  static void DoSomething ()
  {
    Trace curTrace = (Trace)FindObjectOfType( typeof(Trace) );

    var list = new List<WayPoint>();
    var rgx = new Regex(@"d $");

    //Selection.gameObjects doesn't hold selection order
    foreach( var obj in FindObjectsOfType(typeof(WayPoint)) )
    {
      var wp = (WayPoint)obj;

      list.Add(wp);
      wp.name = rgx.Split(obj.name)[0]   wp.editorPriority.ToString("D2");
      wp.trace = curTrace;
    }

    list.Sort( (t1, t2) => t1.editorPriority - t2.editorPriority );
    //ths.wayPoints = list.Select( (v) => v.gameObject ).ToArray();
    curTrace.wayPoints = list.ToArray();
  }
#endif

  public Vector3 GetAtractionPoint()
  {
    return curWP.transform.position;
  }

  public void NextWayPoint()
  {
    SetTrigger( curWP, false );

    var nextIndex = Array.FindIndex( wayPoints, (v) => v == curWP )   1;

    if( nextIndex == wayPoints.Length )
      nextIndex = 0;

    curWP = wayPoints[nextIndex];
    SetTrigger( curWP, true );
  }
}
  

Ответ №1:

Вместо того, чтобы пытаться заставить ваш летающий объект вести себя таким образом с помощью сценариев, было бы намного проще использовать аниматор, который поставляется с Unity.

Вы можете выбирать разные местоположения (путевые точки) с помощью ключевых кадров и использовать встроенные инструменты для создания плавных кривых анимации. Затем, если вам нужно изменить это поведение, просто используйте скрипт для переключения анимации на что-то более подходящее.

Вводные видеоролики по теме> Анимация в Unity