Я не могу заставить врага следовать за игроком в единстве - PullRequest
0 голосов
/ 20 ноября 2018

Враг сначала идет к игроку, затем останавливается и не двигается.Функция chasePlayer запускается каждый кадр, поэтому враг должен обновлять свой пункт назначения каждый кадр, но этого не происходит, он делает это в первую очередь, затем, когда он достигает первого пункта назначения, останавливается и больше не переходит к игроку.Как я могу это исправить?

public class Slime : MonoBehaviour, IEnemy {
    public Transform enemyTarget;
    public float maxHealth, power, toughness;
    public float currentHealth;

    private NavMeshAgent navAgent;
    private Player player;

    void Start() {
        navAgent = GetComponent<NavMeshAgent> ();
        currentHealth = maxHealth;
    }

    void Update() {
        ChasePlayer();
    }

//Makes enemy chases player
    void ChasePlayer() {
        this.player = player;
        navAgent.SetDestination(enemyTarget.position);
        Debug.Log ("Chasing player");
    }
}

Ответы [ 3 ]

0 голосов
/ 21 ноября 2018

Согласно вашему комментарию:

он делает это в первую очередь, затем, когда он достигает первого пункта назначения останавливается и больше не идет к игроку

Мне кажется, что не обновляется позиция игрока.Таким образом, враг проверяет положение игрока только тогда, когда он проснулся, и просто перемещается в это место, затем он прекращает перепроверку.

Попробуйте следующее и дайте нам знать, как оно идет.Единственное отличие состоит в том, что вместо ссылки на плеер в редакторе, он связан с кодом внутри бодрствующего.Я использовал его сам, и он работал нормально.

using UnityEngine;
using System.Collections;

public class Slime: MonoBehaviour
{
    Transform player;        // Ref to the player's position.
    NavMeshAgent nav;        // Ref to the nav mesh agent.

    void Awake ()
    {
        // Set up the references.
        player = GameObject.FindGameObjectWithTag ("Player").transform;
        nav = GetComponent <NavMeshAgent> ();
    }


    void Update ()
    {
        //Here it would be nice to add a stop condition, like when the player is dead or when it is out of range
        ChasePlayer();

    } 

    void ChasePlayer() {
        nav.SetDestination (player.position);
        Debug.Log ("Chasing player");
    }
}

Я использовал следующий учебник в качестве ссылки:

https://unity3d.com/learn/tutorials/projects/survival-shooter/enemy-one?playlist=17144

Из комментариев в вопросеПервоначально я вижу, что вы пытались установить диапазон действия, который вызовет противника.Ниже я даю вам возможный подход для расчета расстояния между двумя объектами GameObject, который вы можете добавить в Update ():

float dist = Vector3.Distance(player.position, transform.position)
if(dist < 10.0)
{
        ChasePlayer();
}

Для справки: https://docs.unity3d.com/ScriptReference/Vector3.Distance.html

0 голосов
/ 21 ноября 2018

Я исправил проблему.Причина, по которой у меня возникла эта проблема, заключалась в том, что модель для игрока была дочерней по отношению к игровому объекту игрока, который не двигался, а только модель, с тех пор я изменил его так, чтобы весь игрок двигался.

0 голосов
/ 21 ноября 2018

Посмотрите на следующую трансформацию цели врага.См. Документацию здесь: https://docs.unity3d.com/ScriptReference/Vector3.MoveTowards.html

Обратите внимание, что вы также можете использовать тот же метод, используя Vector2 для 2D-отслеживания.

using UnityEngine;
using System.Collections;

public class ExampleClass : MonoBehaviour
{
    // The target marker.
    public Transform target;

    // Speed in units per sec.
    public float speed;

    void Update()
    {
        // The step size is equal to speed times frame time.
        float step = speed * Time.deltaTime;

        // Move our position a step closer to the target.
        transform.position = Vector3.MoveTowards(transform.position, target.position, step);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...