Я использую Аниматор для прогулок.Но я также хочу, чтобы персонажи шли по определенным позициям, а не просто шли прямо с анимацией.

И отсюда они начинают идти вперед.Затем я проверяю расстояние от цели и заставляю их останавливаться близко к цели.
Это цель: ShieldFX.

Как только они оказываются достаточно близко, они перестают ходить и солдаты вращаются, но проблема в том, что они не находятся перед серединой ShieldFX:
Два солдата, левый из которых находится вне области ShieldFX,право слишком внутри женского персонажа и слишком много слева.Я хочу, чтобы они оказались в конце, когда они остановятся перед ShieldFX, где оба солдата с обеих сторон ShieldFX и женщина будут посередине.

Так что либо в начале, чтобы как-то расположить их прямо перед ShieldFX, но это трудно сделать точным, либо, возможно, используя что-то в скрипте, чтобы переместить их в нужные мне позиции.
Скриптприкреплен к пустому GameObject:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class AnimatorController : MonoBehaviour
{
public Animator[] animators;
public Transform target;
public float speed = 1f;
public float rotationSpeed;
public bool slowDown = false;
private bool endRot = false;
// Use this for initialization
void Start()
{
for (int i = 0; i < animators.Length; i++)
{
animators[i].SetFloat("Walking Speed", speed);
}
}
// Update is called once per frame
void Update()
{
float distanceFromTarget = Vector3.Distance(animators[2].transform.position, target.position);
if (slowDown)
{
if (distanceFromTarget < 15)
{
float speed = (distanceFromTarget / 15) / 1;
for (int i = 0; i < animators.Length; i++)
{
animators[i].SetFloat("Walking Speed", speed);
}
}
}
if (distanceFromTarget < 2f)
{
for (int i = 0; i < animators.Length; i++)
{
animators[i].SetFloat("Walking Speed", 0);
}
if (!endRot)
{
Quaternion goalRotation = Quaternion.Euler(0f, 0f, 0f);
float angleToGoal = Quaternion.Angle(
goalRotation,
animators[0].transform.localRotation);
float angleThisFrame = Mathf.Min(angleToGoal, rotationSpeed * Time.deltaTime);
// use axis of Vector3.down to keep angles positive for ease of use
animators[0].transform.Rotate(Vector3.up, angleThisFrame);
animators[1].transform.Rotate(Vector3.down, angleThisFrame);
// We end if we rotated the remaining amount.
endRot = (angleThisFrame == angleToGoal);
}
}
}
}
Я пытался в Обновлении добавить эту часть:
for(int i = 0; i < animators.Length; i++)
{
animators[i].transform.position = Vector3.MoveTowards(animators[i].transform.position, target.position, speed * Time.deltaTime);
}
Но затем он заставляет их всех идти к одной точке, и они не останавливаютрасстояние, которое они делали раньше:

В конце я хочу, чтобы они заняли позицию в конце: я переместил родительский объект, символы которогоДитя пока игра работает только для того, чтобы показать, как это должно быть в конце.

Идея состоит в том, что где бы я ни положилперсонаж в позициях, но в конце они шоположение будет как на последнем скриншоте.