Сторожевая точка разворота - PullRequest
0 голосов
/ 22 сентября 2019

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

transform.position = Vector3.MoveTowards (transform.position, patrolPoints [currentPoint].position, moveSpeed * Time.deltaTime);

Я чувствую себя глупо, может быть, просто сгорел мозг, но как бы мне изменить это так, чтобы он перешел от самой высокой точки в патруле к самой низкойуказать?Пробовал это безрезультатно:

transform.position = Vector3.MoveTowards (transform.position, patrolPoints [currentPoint - 1].position, moveSpeed * Time.deltaTime);

1 Ответ

0 голосов
/ 23 сентября 2019

Ваш вопрос очень двусмысленный, но я попытаюсь ответить.

Предполагая, что вы имеете в виду, как двигаться вперед и назад по списку patrolPoints:

Определите свои переменные в верхней части скрипта.

//List of patrolpoints
public Transform[] patrolPoints;
//To go forwards or backwards
public bool forwards = true;
//Current position
public int currentPoint = 0;

Затем в вашей функции Update()мы можем использовать код , который вы представили .

        float moveSpeed = 5.0f;
    transform.position = Vector3.MoveTowards(transform.position, patrolPoints[currentPoint].position, moveSpeed * Time.deltaTime);

Однако , нам нужен какой-то способ циклически проходитьэти позиции , поэтому после вашего предыдущего кода в Update(), напишите

        //Check if the agent has reached the patrol point
    if(transform.position == patrolPoints[currentPoint].position)
    {
        //Check if going forwards and has not reached last patrol
        if (forwards && currentPoint != patrolPoints.Length - 1)
            currentPoint++;
        //Check if going backwards and has not reached first patrol point
        else if (!forwards && currentPoint != 0)
            currentPoint--;
    }

Затем измените логическое значение вперед и назад для перехода вперед и назад, В качестве альтернативы , если вы хотите сразу вернуться к начальной точке патрулирования, просто используйте код (в Update()):

        float moveSpeed = 5.0f;
    transform.position = Vector3.MoveTowards(transform.position, patrolPoints[0].position, moveSpeed * Time.deltaTime);

, который использует 0 в качестве индекса.

Редактировать: если вы хотите, чтобы он достиг назад после достижения конца , просто переключите переменную вперед на false , когда currentPoint достигнет lastPoint. Следовательно, , функция update будет иметь вид:

    void Update()
{
    float moveSpeed = 5.0f;
    transform.position = Vector3.MoveTowards(transform.position, patrolPoints[currentPoint].position, moveSpeed * Time.deltaTime);

    //Check if the agent has reached the patrol point
    if(transform.position == patrolPoints[currentPoint].position)
    {
        //Check if going forwards and has not reached last patrol
        if (forwards && currentPoint != patrolPoints.Length - 1)
            currentPoint++;
        //Check if going forwards and has reached the last patrol
        if (forwards && currentPoint == patrolPoints.Length - 1)
            forwards = false;
        //Check if going backwards and has not reached first patrol point
        else if (!forwards && currentPoint != 0)
            currentPoint--;
        //And to go back if reached back to the start
        else if (!forwards && currentPoint == 0)
            forwards = true;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...