Когда встречаются и агент, дроид справа, и 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();
}
}