让玩家用相同的标签面对不同的敌人

本文关键字:面对 敌人 标签 玩家 | 更新日期: 2023-09-27 17:59:21

我正试图让我的玩家面对不同的敌人,因为女巫敌人是最接近的。我正试图使用transform.lookAt和Vector3.距离,我能够让它发挥作用,但只针对我的玩家遇到的第一个敌人。

我已经列出了敌人的GameObjets,我正在循环浏览它们,以找到最近的敌人和它们的位置。

这就是我到目前为止得到的。

Vars:

 public List<GameObject> targets;
 private GameObject[] enemyList;

漫游:

 void rotateToEnemy() {
         //check if spawnEnemyes is close
         foreach (GameObject target in targets) {
             //transform.LookAt (target.transform.position);
             if (target != null) {
                 float enemyDistance = Vector3.Distance (target.transform.position, transform.position);
                 if (enemyDistance <= 5.0f) {
                     transform.LookAt (target.transform.position);
                     Debug.Log (enemyDistance);
                 }
             }
         }
     }

将Enemis添加到列表:

 void addEnemiesToList() {
     //Make enemy list
     GameObject[] enemyList = GameObject.FindGameObjectsWithTag("skeletonEnemy");
     // Add enem,is to array
     foreach(GameObject enemy in enemyList) {
         targets.Add (enemy);
     }
 }

让玩家用相同的标签面对不同的敌人

在当前版本的代码中,您不一定要查看targets列表中最接近的GameObject

foreach (GameObject target in targets) {
    float enemyDistance = Vector3.Distance (target.transform.position, transform.position);
    if (enemyDistance <= 5.0f) {
        transform.LookAt (target.transform.position);
    }
}

此代码将选择距离不到5个单位的最后一个目标。你应该循环浏览你的目标,只比较距离,然后选择最近的目标。也许类似于:

float minDistance = LARGE_NUMBER;
int closestIndex = -1;
for (int i = 0; i < targets.Count; i++) {
    float enemyDistance = Vector3.Distance (target.transform.position, transform.position);
    if (enemyDistance < minDistance) {
        closestIndex = i;
        minDistance = enemyDistance;
    }
}
if (closestIndex != -1) { transform.LookAt (target.transform.position); }

我不确定你是不是这个意思。如果您希望它始终查看最接近的值,请确保在update()调用它,并将方法更改为类似的方法。

void rotateToEnemy() {
         //check if spawnEnemyes is close
         var closestEnemy;
         var closestDistance = Mathf.infinity;
         foreach (GameObject target in targets) {
             //transform.LookAt (target.transform.position);
             if (target != null) {
                 float enemyDistance = Vector3.Distance (target.transform.position, transform.position);
                 if (enemyDistance <= closestDistance) {
                     closestDistance = enemyDistance;
                     closestEnemy = target;
                 }
             }
         }
         if(closestEnemy != null) {
             transform.LookAt (closestEnemy.transform.position);
             Debug.Log (closestDistance);
         }
     }