Как я могу приостановить перемещение агента navme sh между путевыми точками, а затем продолжить? - PullRequest
0 голосов
/ 07 мая 2020
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using UnityEngine.AI;

public class NavigateAgent : MonoBehaviour
{
    public List<Transform> points = new List<Transform>();
    public List<GameObject> npcs;
    public NavMeshAgent agent;

    private int destPoint = 0;


    void Start()
    {
        var wayPoints = GameObject.FindGameObjectsWithTag("Waypoint");
        foreach (GameObject waypoint in wayPoints)
        {
            points.Add(waypoint.transform);
        }

        npcs = GameObject.FindGameObjectsWithTag("Npc").ToList();

        //agent = GetComponent<NavMeshAgent>();

        // Disabling auto-braking allows for continuous movement
        // between points (ie, the agent doesn't slow down as it
        // approaches a destination point).
        agent.autoBraking = false;

        GotoNextPoint();
    }


    void GotoNextPoint()
    {
        // Returns if no points have been set up
        if (points.Count == 0)
            return;

        // Set the agent to go to the currently selected destination.
        agent.destination = points[destPoint].position;

        // Choose the next point in the array as the destination,
        // cycling to the start if necessary.
        destPoint = (destPoint + 1) % points.Count;
    }

    void VisitNpcs()
    {
        var npc = npcs[Random.Range(0, npcs.Count)];
        var distance = Vector3.Distance(npc.transform.position, agent.transform.position);

        if (distance < 3f)
        {
            // Stop slowly agent.
            // Rotate agent and the npc at the same time slowly smooth to face each other.
        }
    }

    void Update()
    {
        // Choose the next destination point when the agent gets
        // close to the current one.
        if (!agent.pathPending && agent.remainingDistance < 0.5f)
            GotoNextPoint();
    }
}

Если агент при перемещении между путевыми точками находится на расстоянии меньше 3 от одного из случайно выбранных npcs, медленно остановите агента, но достаточно быстро, чтобы не пройти расстояние np c меньше 3, то оба np c и агент должны плавно вращаться лицом друг к другу.

После того, как части вращения закончились и они повернуты лицом друг к другу, сделайте что-нибудь. После того, как эта часть «Сделай что-нибудь» будет закончена, заставьте агента плавно повернуться назад лицом к тому месту, где он был, а затем переместите его снова, чтобы продолжить перемещение путевых точек. Я хочу остановить его и повернуть .... но это больше похоже на паузу, агент вращает, делает что-то, а затем продолжает движение между путевыми точками.

Каждый раз, когда агент посещает np c, называйте это паузой агент. Лог c - приостановить агент и продолжить.

1 Ответ

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

-Остановить Navme sh Сценарий агента

Transform destinationPoint=(create and store temporary destination point)
gameObject.GetComponent<NavMeshAgent>().Stop();

- затем повернуть объект вручную в замедленном режиме и выполнить другие действия

IEnumerator RotateAnimation(float from, float to)
{
    float time = 0.02f;
    int speedOfRotation = 1;
    while (from < to)
    {
        yield return new WaitForSeconds(time);
        from += speedOfRotation;
        gameObject.transform.Rotate(0, speedOfRotation, 0);
    }

}

- а затем вернуться к точке назначения

gameObject.GetComponent<NavMeshAgent>().SetDestination(destinationPoint);

Думаю, это вам поможет;)

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