Как сделать так, чтобы движущийся объект посещал нпс случайным образом? - PullRequest
0 голосов
/ 05 мая 2020

Движущийся объект перемещается между путевыми точками. Я хочу сделать это количество секунд 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);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...