Движущийся объект перемещается между путевыми точками. Я хочу сделать это количество секунд X, например, случайным диапазоном между 5-20, и если объект, который движется, близок к одному из npcs, например, на расстоянии 5 или меньше, тогда вращайте как движущийся объект, так и текущий np c медленно сглаживайте лицом друг к другу.
Лог c: Движущийся объект myTransform перемещается между путевыми точками, и, например, через 7 секунд он проверяет, есть ли np c достаточно близко к нему, есть ли объект перестанет двигаться, и myTransform и np c будут плавно вращаться лицом друг к другу. Что-то произойдет, и sh движущийся объект должен повернуть обратно к маршруту путевых точек, а затем продолжить движение между путевыми точками до следующего c посещения np.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Waypoints : MonoBehaviour
{
public GameObject objectToMove;
public GameObject[] waypoints;
public Transform target;
public float moveSpeed = 1f;
public float rotationSpeed = 1f;
private Transform myTransform;
private int targetsIndex = 0;
private Vector3 originalPosition;
private bool visitNpcsDistance = false;
public float walkSpeed = 15f;
// Use this for initialization
void Start()
{
if (objectToMove == null)
{
myTransform = transform;
}
else
{
myTransform = objectToMove.transform;
}
originalPosition = myTransform.position;
if (waypoints.Length == 0)
{
waypoints = GameObject.FindGameObjectsWithTag("Waypoint");
}
}
// Update is called once per frame
void Update()
{
if (visitNpcsDistance == false)
{
WayPointsAI();
VisitRandomNPC();
}
}
private void WayPointsAI()
{
if (targetsIndex == waypoints.Length)
targetsIndex = 0;
target = waypoints[targetsIndex].transform;
float distance = Vector3.Distance(myTransform.position, target.transform.position);
myTransform.rotation = Quaternion.Slerp(myTransform.rotation, Quaternion.LookRotation(target.position - myTransform.position), rotationSpeed * Time.deltaTime);
//move towards the player
myTransform.position += myTransform.forward * moveSpeed * Time.deltaTime;
if (distance < 0.3f)
targetsIndex++;
}
private void VisitRandomNPC()
{
GameObject[] npcs = GameObject.FindGameObjectsWithTag("Npc");
for (int i = 0; i < npcs.Length; i++)
{
var distance = Vector3.Distance(npcs[i].transform.position, myTransform.position);
if (distance < 5f)
{
visitNpcsDistance = true;
StartCoroutine(VisitNpc());
}
}
}
IEnumerator VisitNpc()
{
yield return new WaitForSeconds(0f);
visitNpcsDistance = false;
}
void DrawLinesInScene()
{
// draw lines between each checkpoint //
for (int i = 0; i < waypoints.Length - 1; i++)
{
Debug.DrawLine(waypoints[i].transform.position, waypoints[i + 1].transform.position, Color.blue);
}
// draw a line between the original transform start position
// and the current transform position //
Debug.DrawLine(originalPosition, transform.position, Color.red);
// draw a line between current transform position and the next waypoint target
// each time reached a waypoint.
if (target != null)
Debug.DrawLine(target.transform.position, myTransform.position, Color.green);
}
}