敌人一开始向玩家走去,然后停下来不动。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");
}
}发布于 2018-11-21 14:57:54
根据您的评论:
它在第一个实例中这样做,然后当它到达第一个目的地时停止,不再去玩家那里
在我看来,没有更新的是球员的位置。所以敌人只会在唤醒的时候检查玩家的位置,然后移动到那个位置,然后停止再检查。
尝试下面的方法,让我们知道它的进展。唯一的区别是不是在编辑器中链接播放器,而是通过唤醒中的代码进行链接。我自己也在使用它,它工作得很好。
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
从问题中的评论中,我看到你最初是想设定一个可以触发敌人的行动范围。下面我给你一种可能的方法来计算两个GameObjects之间的距离,你可以在Update()中添加:
float dist = Vector3.Distance(player.position, transform.position)
if(dist < 10.0)
{
ChasePlayer();
}作为参考:https://docs.unity3d.com/ScriptReference/Vector3.Distance.html
发布于 2018-11-21 07:43:09
研究enemyTarget的后续变换。请参阅此处的文档:https://docs.unity3d.com/ScriptReference/Vector3.MoveTowards.html
请注意,您也可以使用Vector2对二维跟随使用相同的方法。
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);
}
}发布于 2018-11-22 02:44:35
我修复了这个问题。我有这个问题的原因是因为玩家的模型是玩家游戏对象的孩子,它不会移动,只有模型才会移动,我后来更改了它,所以整个玩家都会移动。
https://stackoverflow.com/questions/53400476
复制相似问题