2014-11-29 2 views
1

Мне нужно, чтобы вы читали о погоде, когда автомобиль игрока идет 1-й, 2-й или 3-й против 2 автомобилей ИИ, я попытался выполнить это, используя лучевое кастинг безрезультатно. У меня есть точки маршрута на уровне периодически, и у меня есть система, которая устанавливает новую путевую точку, когда ИИ или игрок входит в нее, затем она направляет луч на следующую контрольную точку, чтобы я мог рассчитать ее расстояние, используя hit.distance, а затем назначил это расстояние каждое обновление переменной float. Однако он не получает право на заказ, и когда я нахожусь сначала, он отображает все возможные комбинации при отладке. Основная проблема, о которой я думаю, приходит, когда я отлаживаю дистанцию, im рядом с путевой точкой, и она может сказать 300, или это может сказать 0,003447 или что-то еще, и это меня действительно сбивает с толку.Raycasting Issue Unity

Ниже сценарий для литья лучей:

using UnityEngine; 
using System.Collections; 

public class RaceManager : MonoBehaviour { 
    public GameObject seeking; 
    public float distance1; 
    public float distance2; 
    public float distance3; 
    public int playerPos; 

    void Update(){ 
     Debug.Log (playerPos); 
     //Firing Rays to the target every update and recording its distance. 
     if (this.gameObject.name == "Player") { 
      RaycastHit hit; 
      Ray playerRay = new Ray (this.gameObject.transform.position, seeking.transform.position); 
      if (Physics.Raycast (playerRay, out hit)) { 
       distance1 = hit.distance; 
       Debug.DrawLine (this.transform.position, seeking.transform.position); 
      } 
     } 
     if (this.gameObject.name == "AICar1"){ 
     RaycastHit hit; 
     Ray playerRay = new Ray (this.gameObject.transform.position, seeking.transform.position); 
     if (Physics.Raycast (playerRay, out hit)){ 
       distance2 = hit.distance; 
       Debug.DrawLine(this.transform.position, seeking.transform.position); 
     } 
    } 
     if (this.gameObject.name == "AICar2") { 
     RaycastHit hit; 
     Ray playerRay = new Ray (this.gameObject.transform.position, seeking.transform.position); 
      if (Physics.Raycast (playerRay, out hit)){ 
       distance3 = hit.distance; 
       Debug.DrawLine(this.transform.position, seeking.transform.position); 

      } 
     } 

     //Decide placement based on Ray Length. 
     //If Player is first. 
     if (distance1 < distance2 && distance1 < distance3) { 
       playerPos = 1; 
      } 
     else if (distance1 < distance2 && distance1 > distance3 || distance1 > distance2 && distance1 < distance3) { 
       playerPos = 2; 
     } 
     else { 
       playerPos = 3; 
     } 
    } 
} 

А вот скрипт отвечает за изменение цели, когда игрок или AI добраться до него

using UnityEngine; 
using System.Collections; 

public class RaceManager : MonoBehaviour { 
    public GameObject seeking; 
    public float distance1; 
    public float distance2; 
    public float distance3; 
    public int playerPos; 

    void Update(){ 
     Debug.Log (playerPos); 
     //Firing Rays to the target every update and recording its distance. 
     if (this.gameObject.name == "Player") { 
      RaycastHit hit; 
      Ray playerRay = new Ray (this.gameObject.transform.position, seeking.transform.position); 
      if (Physics.Raycast (playerRay, out hit)) { 
       distance1 = hit.distance; 
       Debug.DrawLine (this.transform.position, seeking.transform.position); 
      } 
     } 
     if (this.gameObject.name == "AICar1"){ 
     RaycastHit hit; 
     Ray playerRay = new Ray (this.gameObject.transform.position, seeking.transform.position); 
     if (Physics.Raycast (playerRay, out hit)){ 
       distance2 = hit.distance; 
       Debug.DrawLine(this.transform.position, seeking.transform.position); 
     } 
    } 
     if (this.gameObject.name == "AICar2") { 
     RaycastHit hit; 
     Ray playerRay = new Ray (this.gameObject.transform.position, seeking.transform.position); 
      if (Physics.Raycast (playerRay, out hit)){ 
       distance3 = hit.distance; 
       Debug.DrawLine(this.transform.position, seeking.transform.position); 

      } 
     } 

     //Decide placement based on Ray Length. 
     //If Player is first. 
     //All signs reversed for testing 
     if (distance1 < distance2 && distance1 < distance3) { 
       playerPos = 1; 
      } 
     else if (distance1 < distance2 && distance1 > distance3 || distance1 > distance2 && distance1 < distance3) { 
       playerPos = 2; 
     } 
     else { 
       playerPos = 3; 
     } 
    } 
} 

ответ

2

Если вы знаете позицию точки интереса, а также положения всех транспортных средств в окружающей среде, то просто используйте функцию статического расстояния в классе Vector3Vector3.Distance. Просто приложите ссылки на трансмиссии транспортных средств, затем измерьте расстояние между каждым автомобилем и соответствующей путевой точкой. Есть тонна более накладных расходов, используя методы лучевого литья, чтобы делать то, что вы хотите сделать.

+1

Хорошо спасибо, дайте ему пойти – Luke

+0

СПАСИБО! Я никогда не знал, что смогу это сделать, но это сработало, Kudos. Я правильно ответил на ваш ответ! : D – Luke

+0

Отлично :-) Я рад, что смогу помочь. –