Unity C#: проблема при перемещении объектов по заданному пути - PullRequest
0 голосов
/ 09 мая 2020

Я пытаюсь создать движение по пути от одной точки к другой, используя следующий сценарий:

using UnityEngine;
public class FollowThePath : MonoBehaviour {

// Array of waypoints to walk from one to the next one
[SerializeField]
private Transform[] waypoints;

// Walk speed that can be set in Inspector
[SerializeField]
private float moveSpeed = 2f;

// Index of current waypoint from which Enemy walks
// to the next one
private int waypointIndex = 0;

// Use this for initialization
private void Start () {

    // Set position of Enemy as position of the first waypoint
    transform.position = waypoints[waypointIndex].transform.position;
}

// Update is called once per frame
private void Update () {

    // Move Enemy
    Move();
}

// Method that actually make Enemy walk
private void Move()
{
    // If Enemy didn't reach last waypoint it can move
    // If enemy reached last waypoint then it stops
    if (waypointIndex <= waypoints.Length - 1)
    {

        // Move Enemy from current waypoint to the next one
        // using MoveTowards method
        transform.position = Vector2.MoveTowards(transform.position,
           waypoints[waypointIndex].transform.position,
           moveSpeed * Time.deltaTime);

        // If Enemy reaches position of waypoint he walked towards
        // then waypointIndex is increased by 1
        // and Enemy starts to walk to the next waypoint
        if (transform.position == waypoints[waypointIndex].transform.position)
        {
            waypointIndex += 1;
        }
    }
}

}

Однако эта часть не запускается, что бы я ни пробовал :

if (transform.position == waypoints[waypointIndex].transform.position)
        {
            waypointIndex += 1;
        }

Он срабатывает, только если я помещаю его в update () перед функцией movs. Если я добавлю его после функции перемещения в update (), он никогда не сработает, и объект никогда не будет перемещаться так же, как его исходная форма.

Что я здесь делаю не так?

Ответы [ 3 ]

1 голос
/ 09 мая 2020

Если вы измените позицию символа с помощью

moveSpeed * Time.deltaTime

, позиция не будет точно соответствовать ни одной из позиций вашего массива, потому что Time.deltaTime - это время, прошедшее с последнего кадра, и это переменное число с плавающей запятой с множеством десятичных чисел. Это приводит к тому, что позиция не будет "точно" такой же, поэтому не запускается интересующая вас часть кода. Если вы поместите ее раньше, имеет смысл, что она работает, потому что в start () уже в точной позиции ваш путь, сын условие истинно.

Для последнего условия if, которое должно быть выполнено, вам нужно будет обновить положение символа на вашем пути через точные его точки, увеличивая вместо этого индекс путевых точек [waypointIndex] of with Time.deltaTime.

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

https://assetstore.unity.com/packages/tools/animation/itween-84

Я могу предоставить пробный сценарий, если вы заинтересованы и найдете его полезным.

Надеюсь, что это поможет.

1 голос
/ 09 мая 2020

Вложен, если в некоторых функциях иногда выдают ошибки. Вы пытались использовать метод печати, чтобы увидеть, входит ли ваша функция во второй оператор if или нет. Если нет, попробуйте это. А также создайте другой метод и получите параметр, который в данном случае для вашего кода равен waypointIndex, а затем попробуйте вызвать его внутри метода Move.

0 голосов
/ 09 мая 2020

Я думаю, это должно сработать, проблема заключалась в том, что Time.DeltaTime дает время между кадрами в секундах, поэтому оно никогда не будет равно числу, которое вы проверяете, и поскольку вы проверяете позицию, которую вы не можете сделать> = поэтому, используя переменная текущего расстояния отслеживает, как далеко он прошел. есть способы лучше найти расстояние между точками, но я сделал это быстро. Также вам может потребоваться изменить индекс, чтобы вы не получали исключение за пределами границ для первых l oop через.

using UnityEngine;
public class FollowThePath : MonoBehaviour {

// Array of waypoints to walk from one to the next one
[SerializeField]
private Transform[] waypoints;

// Walk speed that can be set in Inspector
[SerializeField]
private float moveSpeed = 2f;
float currentDist;
Vector3 StartPos;

// Index of current waypoint from which Enemy walks
// to the next one
private int waypointIndex = 0;

// Use this for initialization
private void Start () {

    // Set position of Enemy as position of the first waypoint
    transform.position = waypoints[waypointIndex].transform.position;
}

// Update is called once per frame
private void Update () {

    // Move Enemy
    Move();
}

// Method that actually make Enemy walk
private void Move()
{
    // If Enemy didn't reach last waypoint it can move
    // If enemy reached last waypoint then it stops
    if (waypointIndex <= waypoints.Length - 1)
    {

        // Move Enemy from current waypoint to the next one
        // using MoveTowards method

        currentDist += moveSpeed * Time.deltaTime;

        transform.position = Vector2.MoveTowards(transform.position,
           waypoints[waypointIndex].transform.position,
           moveSpeed * Time.deltaTime);

        // If Enemy reaches position of waypoint he walked towards
        // then waypointIndex is increased by 1
        // and Enemy starts to walk to the next waypoint

        if(StartPos == null) {
            if(waypointIndex == 0) {
                float StartPos = waypoints[waypointIndex-1].transform.position;
            }
            else
            {
                float StartPos = transform.position;
            }
        }

        float WaypointDist = Vector3.Distance(StartPos, waypoints[waypointIndex].transform.position);
        if (currentDist >= WaypointDist )
        {
           waypointIndex += 1;
           StartPos = null;
        }
    }
}

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...