我无法让敌人团结一致地跟随玩家

时间:2018-11-20 19:46:20

标签: c# unity3d

敌人首先进入玩家,然后停下来并且不移动。 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 :(得分:1)

根据您的评论:

首先进行操作,然后在到达第一个目的地时停止播放,不再播放器

在我看来,没有刷新的是玩家位置。因此,敌人只会在醒来时检查玩家的位置,然后移动到该地点,然后停止重新检查。

尝试以下操作,让我们知道如何进行。唯一的区别是它不是通过编辑器链接播放器,而是通过唤醒中的代码链接。我自己使用它,并且运行良好。

Highchart

我使用以下教程作为参考:

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

从问题的评论中,我最初看到您正在尝试设置一个会触发敌人的行动范围。下面,我为您提供了一种计算两个GameObject之间距离的可能方法,您可以将其添加到Update()中:

CharView

作为参考:https://docs.unity3d.com/ScriptReference/Vector3.Distance.html

答案 1 :(得分:0)

查看敌人目标的以下转换。在此处查看文档:{​​{3}}

请注意,您还可以使用将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);
    }
}

答案 2 :(得分:0)

我解决了这个问题。我遇到这个问题的原因是因为玩家的模型是该玩家游戏对象的一个​​孩子,而该对象并不能唯一地移动模型,所以我更改了它,以便整个玩家都可以移动。