Вражеское движение, чтобы следовать за игроком только в диапазоне, используя navmesh - PullRequest
1 голос
/ 06 июля 2019

Я очень новичок в C # (около 1 недели), поэтому я много читал уроки. В данный момент я пытаюсь отредактировать фрагмент кода (учебник по единству), чтобы враг следовал за игроком только в определенном диапазоне игрока (10 футов), но, к сожалению, не изменив полностью код, я не могу найти решение , В настоящий момент противник будет следовать за игроком только тогда, когда игрок жив (что я тоже хочу).

Я пытался погуглить то, что хочу, но я не хочу менять код слишком сильно. Я очень новичок в C # и в настоящее время учусь понемногу, другие методы, которые я нашел, требуют от меня много изменений в коде. Насколько я понимаю, основной упор в приведенном ниже коде заключается в том, чтобы враг полностью контролировал Nav Mesh Agent, могу ли я сохранить ту же технику?

using UnityEngine;
using System.Collections;

public class EnemyMovement : MonoBehaviour
{
    Transform player;
    PlayerHealth playerHealth;
    EnemyHealth enemyHealth;
    UnityEngine.AI.NavMeshAgent nav;

    void Awake()
    {
        // references
        player = GameObject.FindGameObjectWithTag("Player").transform;
        playerHealth = player.GetComponent<PlayerHealth>();
        enemyHealth = GetComponent<EnemyHealth>();
        nav = GetComponent<UnityEngine.AI.NavMeshAgent>();
    }


    void Update()
    {
        if (enemyHealth.currentHealth > 0 && playerHealth.currentHealth > 0)
        {
            nav.SetDestination(player.position);
            transform.LookAt(player);
        }
        else
        {
            nav.enabled = false;
        }
    }
}

Если возможно, я бы хотел добавить 2 функции. 1 - проверка, если игрок жив, а другая - проверка, находится ли игрок на расстоянии. Сейчас я не очень разбираюсь в raycast, так что это будет следующим шагом для меня, чтобы научиться работать так, как я хочу?

Спасибо за ваше время. Дин.

1 Ответ

0 голосов
/ 06 июля 2019

Вы можете рассчитать расстояние, выполнив:

float distance = Vector3.Distance(player.transform.position,transform.position);

Вы можете сделать проверку, если она не больше некоторой суммы, с помощью:

bool playerIsCloseEnough = distance <= amount; 

И вы можете проверить, жив ли игрок с:

 bool playerIsAlive = playerHealth.currentHealth > 0;

Тогда вы можете делать вещи, если они оба верны с:

if (playerIsAlive && playerIsCloseEnough) 
{
    // ...
}

И, как вы упомянули в комментарии, вам нужно установить nav.enabled=true; в void Awake или void Start, чтобы убедиться, что сетка навигации включена:)

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