敌人移动时仅在使用导航网格的范围内跟随玩家

时间:2019-07-05 21:17:22

标签: c# unity3d

我是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个if函数。 1个是检查播放器是否还活着,另一个是检查播放器是否在距离内。我目前对raycast的了解不多,所以这将是我下一步学习如何按照我的意愿进行工作的方法吗?

谢谢您的宝贵时间。 院长。

1 个答案:

答案 0 :(得分:0)

您可以通过以下方式计算距离:

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,以确保打开导航网格:)