让玩家面对具有相同标记的不同敌人

时间:2016-07-29 11:46:29

标签: c# unity3d

我试图让我的玩家面对不同的敌人基于女巫敌人是最接近的。我正试图使用​​transform.lookAt和Vector3.Distance面对最近的敌人,我能够使它工作,但只能在我的玩家进入的第一个敌人身上。

我列出了敌人的GameObjets,我正在通过它们来寻找最近的敌人及其位置。

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

瓦尔:

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

Roatation:

 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);
     }
 }

2 个答案:

答案 0 :(得分:1)

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

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); }

答案 1 :(得分:0)

我不确定你是不是这个意思。如果您希望它始终查看最接近的,请确保在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);
         }
     }