2013-12-13 3 views
0

Я работаю над симулятором в Unity3D, и мне нужен объект-клиент, чтобы иметь возможность автоматически находить объект магазина с самой низкой ценой.Unity3D: Автоматическая цель в соответствии с ценой

Я сделал небольшое испытание на этом сам и нашел, что это довольно сложно достичь. Так я надеялся, что кто-то может помочь мне настроить мой код немного дальше в правильном направлении? :)

Вот код, я получил до сих пор:

var cityName : String; 
var shopScript : MarketScript; 


function FindShopPlace() : GameObject //Make a queueing system 
{ 
    var max : float; 
    var target : GameObject; 
    var gos : GameObject[]; 

    var goScript : MarketScript; 

    gos = GameObject.FindGameObjectsWithTag("market"); 

    for (var go : GameObject in gos) 
    { 
     goScript = go.GetComponent(MarketScript); 

     if (goScript.cityName == cityName) 
     { 
      if (goScript.resalePrice >= max && goScript.cityName == cityName) 
      { 
       max = goScript.resalePrice; 
      } 

      if (goScript.resalePrice < max && goScript.cityName == cityName) 
      { 
       print ("test"); 
       target = go; 
      } 
     } 
    } 
    shopScript = target.GetComponent(MarketScript); 
    return target; 
} 

В настоящее время с этим кодом, цель никогда не найден и назначен. Я получаю следующее NullReferenceException от линии № 3 от дна:

NullReferenceException: ссылка на объект не указывает на экземпляр объекта ConsumerScript.FindShopPlace() (на активы/_MyAssets/_Scripts/ConsumerScript.js: 268) ConsumerScript.Update () (на активы/_MyAssets/_Scripts/ConsumerScript.js: 96)

ответ

0

Вы получаете NullReferenceException, потому что цель никогда не был установлен какой-либо объект.

Что вы делаете в своем цикле: (1) находите максимальную цену и (2) находите последний объект после максимума, который меньше максимального.

Итак, если ваши цены в порядке 1, 2, 3 цели никогда не будут установлены, потому что на каждом шаге вы устанавливаете максимальное значение в новое значение и никогда не устанавливаете цель. Даже если установить его не обязательно самым дешевым. Рассмотрим цены 1, 3, 2.

First Step: Set maximum to 1 
Second Step: Set maximum to 3 
Third Step: Set target to the GameObject with price 2 

Если у вас возникли такие ошибки, попробуйте простые примеры, подобные этому, чтобы разобраться в деталях. Кроме того, вы используете максимальный максимум (сравнивая первый раз), не устанавливая его ни на что, не уверен, что это работает в Javascript (может быть), но его плохая практика

Что вы действительно хотите - не найти максимальную цену или минимум но GameObject с самой низкой ценой перепродажи.

var min : float; 
var success : boolean; 
var firstHit : boolean; 


... 

success = false; 
firstHit = true; 

for (var go : GameObject in gos) 
{ 
    goScript = go.GetComponent(MarketScript); 

    if (goScript.cityName == cityName) 
    { 
     success = true; 

     if(firstHit) // alternatively to this would be to set minimum to a value that is higher than every possible price (thats also what i meant with you shouldnt use max without setting it to anything) 
     { 
      min = goScript.resalePrice; 
      target = go; 
     } 
     else 
     { 
      if (goScript.resalePrice < min) 
      { 
       min = goScript.resalePrice; 
       target = go; 
      } 
     } 
    } 
} 

if(success) 
{ 
    shopScript = target.GetComponent(MarketScript); 
    return target; 
} 
else 
{ 
    // TODO: handle the case that there isnt a shop in the city. 
    //  Maybe give an error Message with Debug.Log if this isnt supposed to happen 

    return null; 
} 
+0

Вы потрясающий человек! Трюк об удержании минимального значения делает гораздо больше, и я сработал с вашей помощью в считанные минуты. Я не могу вас поблагодарить! :) –

Смежные вопросы