Как я могу заставить np c смотреть на агента головой или с помощью transform.lookat? - PullRequest
1 голос
/ 08 мая 2020

Когда встречаются и агент, дроид справа, и np c слева, они также поворачиваются лицом друг к другу, и агент, кажется, смотрит на np c, но np c - заморозил эту позицию, поскольку я отключил компонент аниматора np c.

Теперь я хочу, чтобы np c также смотрел на агента.

np c в В этом случае я могу изменить его голову, а также верхний конец положения и поворота головы. Похоже, что когда я отключаю аниматор, np c смотрит вниз. Я могу заставить np c менять анимацию на холостой ход, но все еще не знаю, как заставить его смотреть на дроида-агента.

Np c лицом вниз

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

Изменение поворота головы на X

Если я используя преобразование, np c падает на спину:

Используя lookat, np c падает на спину

В итоге я вижу, что также дроид-агент не смотрит на агента. но у дроида-агента нет головной части, которая мне нужна для поворота всего дроида на X

Я хочу, чтобы оба np c и агент, вращающие друг друга, чтобы они также смотрели, сглаживают друг друга.

У дроида есть компоненты: Animator, box ocllider, жесткое тело, navmeshagent

У np c есть компонент: Аниматор

Это сценарий, который я использую для ротации (встречи) в мете hod VisitNpcs:

using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using UnityEngine.AI;

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

    private int destPoint = 0;
    private int damping = 2;

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

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

        // 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 > 7)
        {
            agent.destination = npc.transform.position;
            var collider = agent.GetComponent<BoxCollider>();
            if (collider != null)
            {
                collider.enabled = false;
            }
        }

        if (distance < 2.5f)
        {
            agent.isStopped = true;

            npc.GetComponent<Animator>().enabled = false;

            Vector3 lookPos = agent.transform.position - npc.transform.position;
            lookPos.y = 0;
            var rotation = Quaternion.LookRotation(lookPos);
            npc.transform.rotation = Quaternion.Slerp(npc.transform.rotation, rotation, Time.deltaTime * damping);
            //npc.transform.LookAt(agent.transform);
        }
    }

    void Update()
    {
        // Choose the next destination point when the agent gets
        // close to the current one.


        if (!agent.pathPending && agent.remainingDistance < 0.5f)
        {
            GotoNextPoint();
        }

        VisitNpcs();
    }
}

1 Ответ

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

, чтобы выглядеть гладко, вы можете использовать Coroutine и установить время, отведенное для этого вращения: Здесь мы позволяем 2s вращаться в PositionToLook .. Указанное время автоматически регулирует скорость вращения

    StartCoroutine(RotateToDirection(player, target.position, 2f));

public IEnumerator RotateToDirection(Transform transform, Vector3 positionToLook, float timeToRotate)
{
    var startRotation = transform.rotation;
    var direction = positionToLook - transform.position;
    var finalRotation = Quaternion.LookRotation(direction);
    var t = 0f;
    while (t <= 1f)
    {
        t += Time.deltaTime / timeToRotate;
        transform.rotation = Quaternion.Slerp(startRotation, finalRotation, t);
        yield return null;
    }
    transform.rotation = finalRotation;
}

, поэтому вы запускаете две одинаковые сопрограммы, одну для NP C, а другую для Droid.

Я не знаю, как это делается с вашим NP C, но я предлагаю вам создать пустой GameObject и поместите все элементы головы, как дети, и вы повернете пустой игровой объект ... я полагаю, что остальная часть тела имеет анимацию ... (ноги, ступни ...)

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