2016-07-29 48 views
0

我试图让我的玩家面对基于巫师敌人最不同的敌人。我正在尝试使用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); 
    } 
} 

回答

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

谢谢!奇迹般有效! 我只是做了一些修改,使它只能瞄准最近的敌人,如果它在5个单位的距离内,我也做了一些更新列表,因为我的敌人死亡,并在随机位置重新生成。 谢谢你的反馈:) – Jsf

1

在你的代码的当前版本,你不一定看您的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); }