【问题标题】:Make player face different enemies with the same tag让玩家面对具有相同标签的不同敌人
【发布时间】:2016-07-29 11:46:29
【问题描述】:

我试图让我的玩家面对基于女巫敌人最接近的不同敌人。我正在尝试使用 transform.lookAt 和 Vector3.Distance 面对最近的敌人,我可以让它工作,但仅限于我的玩家遇到的第一个敌人。

我已经列出了敌人的 GameObjets,我正在遍历它们以找到最近的敌人及其位置。

这是我目前得到的。

变量:

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

         }
     }

将敌人添加到列表中:

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

【问题讨论】:

    标签: c# unity3d


    【解决方案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); }
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 谢谢!奇迹般有效!我只是做了一些修改,让它只针对最近的敌人(如果它在 5 个单位距离内),我还对列表进行了一些更新,因为我的敌人死亡并在随机位置重新生成。感谢您的反馈:)
      猜你喜欢
      • 2016-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-29
      • 2021-12-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多