敌人首先进入玩家,然后停下来并且不移动。 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");
}
}
答案 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)
我解决了这个问题。我遇到这个问题的原因是因为玩家的模型是该玩家游戏对象的一个孩子,而该对象并不能唯一地移动模型,所以我更改了它,以便整个玩家都可以移动。