У меня есть один объект, движущийся по кривой Безье, но у меня есть несколько объектов, которым необходимо следовать по этому пути, но все они следуют одновременно. Этот объект является врагом типа змеи в космическом шутере.
До сих пор я пытался сделать все объекты дочерними, но при этом они остаются по прямой линии к родителю, следуя кривой Безье.Я также сделал все объекты отдельными и прикрепил к ним скрипт Безье, чтобы они все следовали по одному и тому же маршруту, и это работает, но только они следуют по одному и тому же пути одновременно.
public class BezierFollow : MonoBehaviour{
[SerializeField]
private Transform[] routes;
private int routeToGo;
private float tParam;
private Vector2 enemyPosition;
[SerializeField]
public float speedModifier = 0.5f;
private bool coroutineAloud;
// Start is called before the first frame update
void Start()
{
routeToGo = 0;
tParam = 0f;
//speedModifier = 0.5f;
coroutineAloud = true;
}
// Update is called once per frame
void Update()
{
if (coroutineAloud)
{
StartCoroutine(GoByTheRouteRoutine(routeToGo));
}
}
private IEnumerator GoByTheRouteRoutine(int routeNumber)
{
coroutineAloud = false;
Vector2 p0 = routes[routeNumber].GetChild(0).position;
Vector2 p1 = routes[routeNumber].GetChild(1).position;
Vector2 p2 = routes[routeNumber].GetChild(2).position;
Vector2 p3 = routes[routeNumber].GetChild(3).position;
while(tParam < 1)
{
tParam += Time.deltaTime * speedModifier;
enemyPosition = Mathf.Pow(1 - tParam, 3) * p0 +
3 * Mathf.Pow(1 - tParam, 2) * tParam * p1 +
3 * (1 - tParam) * Mathf.Pow(tParam, 2) * p2 +
Mathf.Pow(tParam, 3) * p3;
transform.position = enemyPosition;
yield return new WaitForEndOfFrame();
}
tParam = 0f;
routeToGo += 1;
if(routeToGo > routes.Length - 1)
routeToGo = 0;
coroutineAloud = true;
}}
Вот скрипт маршрутовя не думаю, что вам понадобится, но я включу это
public class Route : MonoBehaviour{
[SerializeField]
private Transform[] controlPoints;
private Vector2 gizmosPos;
private void OnDrawGizmos()
{
for(float t = 0; t <= 1; t += 0.05f)
{
gizmosPos = Mathf.Pow(1 - t, 3) * controlPoints[0].position +
3 * Mathf.Pow(1 - t, 2) * t * controlPoints[1].position +
3 * (1 - t) * Mathf.Pow(t, 2) * controlPoints[2].position +
Mathf.Pow(t, 3) * controlPoints[3].position;
Gizmos.DrawSphere(gizmosPos, 0.25f);
}
Gizmos.DrawLine(new Vector2(controlPoints[0].position.x, controlPoints[0].position.y),
new Vector2(controlPoints[1].position.x, controlPoints[1].position.y));
Gizmos.DrawLine(new Vector2(controlPoints[2].position.x, controlPoints[2].position.y),
new Vector2(controlPoints[3].position.x, controlPoints[3].position.y));
}}
Я думаю, что мне нужно сделать, чтобы каждый объект не был дочерним объектом, и у всех был прикреплен скрипт для следования по маршруту, но такжеотсроченное время, прежде чем он пойдет по пути, но не уверен, как это сделать.Я подумал, что это может быть необходимо сделать в отдельном скрипте, потому что в скрипте кривой Безье он установлен так, что объект начинается снова в начале маршрута, как только достигает конца