2015-10-09 3 views
0

У меня есть небольшая программа, которую я пишу. У меня есть несколько небольших выражений, которые я ищу для доступа из другого сценария. Проблема заключается в том, что когда я получаю возврат в инспекторе (что правильно), другой скрипт не распознает его. По моим исследованиям, кажется, что void не является правильным типом возврата функции, и мне нужно что-то еще.Возвращение булева и доступ к этой информации

Кроме того, поскольку я получаю правильный возврат в инспекторе, я думал, что это стоило бы отметить, что я получаю ошибку Null Ref при попытке играть в игру на сценарий, который не признает BOOL

Я буду включать код, который я использую. Версия Unity, которую я использую, - это 5.2.1f1, 64-бит. Кроме того, я использовал Awake и Start. Ничего не сработало. Поскольку я не думал, что это имеет значение, но я подумал, что я сделаю это.

Я ценю помощь.

public class nonButtonStuff : MonoBehaviour 
{ 

public float timer; 
public float tipPercent; 
public float checkAmount; 

private Seated seated; 
private dessert Dessert; 
private drinks Drinks; 
private food Food; 
private appetisers Appetisers; 
private checkedUpon checkedOn; 



// Use this for initialization 
void Awake() 
{ 
    tipPercent = .2f; 
    checkAmount = 0; 
    seated = GetComponent<Seated>(); 
    Dessert = GetComponent<dessert>(); 
    Drinks = GetComponent<drinks>(); 
    Food = GetComponent<food>(); 
    Appetisers = GetComponent<appetisers>(); 
    checkedOn = GetComponent<checkedUpon>(); 
} 

void Update() 
{ 
      if(seated.isSeated == true && Drinks.drinksOrdered == true || Drinks.drinksOrdered != false && seated.isSeated == false) 
      { 
       timer += Time.deltaTime * 1; 
      } 

      if(Dessert.Dessert==true) 
      { 
       timer = 0; 
      } 
      if (checkedOn.checkedOn > 0) 
      { 
       Debug.Log(checkedOn); 
      } 

    } 
} 

~~~~~~~~~~

public class Seated : MonoBehaviour 
{ 

    public bool isSeated = false; 

    public void clicked() 
    { 

     isSeated = true; 
     Debug.Log("Was clicked."); 
     return; 
    } 
} 

Edited для ясности щелкнутого():

Я использовал встроенный редактор пользовательского интерфейса, чтобы добавить кнопку для сидячих , Таким образом, нет жестко закодированной кнопки. Но когда я «играю» и нажимаю кнопку, это дает мне логическое значение как правильное. Однако nonButtonStuff не распознает «isSeated» как == true.

+1

В чем именно возникают проблемы. Если это метод, то метод реализует интерфейс ('update' и т. Д.), А затем возвращаемое значение не может быть изменено. – Cjen1

+1

. Точная проблема заключается в том, что nonButtonStuff.cs не распознает, что произошло изменение в isSeated bool, закодированном в Seated .cs. –

+0

@ Тим Я думал, что сделал это, когда я назвал его «сидящим = GetComponent ();» –

ответ

0

Если вы получаете Null Reference Exception, это, скорее всего, означает, что ваша сидящая переменная (установленная в функции Awake) не настроена ни на что, поэтому вызов GetComponent не находит однопользовательскую игру в игре объект. Это произойдет, если ваше сидящее однопользовательское поведение и ваше однопользовательское поведение не будут существовать в одном GameObject, так что будьте уверены, что они это делают.

+0

Это очистило ошибку NullRef. Это восхитительно. Я ценю это. Я использовал два разных объекта для размещения этих кодов. Большое вам спасибо, Кит. –

+0

Без проблем! Рад помочь –

1

Я не думаю, что ваша проблема связана с isSeated. Я думаю, что проблема в логике этой линии:.

if(seated.isSeated == true && Drinks.drinksOrdered == true || Drinks.drinksOrdered != false && seated.isSeated == false) 

Вы по существу говоря «если isSeated и drinksOrdered или напитки заказываются и не сидеть, что всегда возвращает истину, если напитки заказываются, независимо от состояния .. из isSeated

также примечание о стиле C# вам не нужно сравнивать логические значения с помощью «==», как вы делаете это:.

if(myBoolean){} 

тот же код, как

if(myBoolean == true){} 

Большинство людей любят писать более простой код, чтобы уменьшить риск логических ошибок. Ваш код может для этого быть переписано в виде

if(seated.isSeated && Drinks.drinksOrdered || Drinks.drinksOrdered && !seated.isSeated) 

С

if(seated.isSeated || !seated.isSeated) 

хорошо всегда возвращает истину, вы можете просто удалить эти значения.Это оставляет вас с

if(Drinks.drinksOrdered || Drings.drinksOrdered) 

Это может быть уменьшена просто

if(Drinks.drinksOrdered) 

Это точно такая же логика, что и исходный код:

if(seated.isSeated == true && Drinks.drinksOrdered == true || Drinks.drinksOrdered != false && seated.isSeated == false) 

Это просто понятнее.

+0

После устранения неполадок в моей логике для этого примера я заметил, что, поскольку я не был строгим в своем коде, я установил его так, чтобы сидеть и напитки должны были возвращаться. Итак, чтобы это стало проще, я просто сделал: ** seated.isSeated == true && Drinks.drinksOrdered == false || Drinks.drinksOrdered == true && seated.isSeated == false ** как стартер таймера. Позже я понял, что мне нужно сразу несколько таймеров. Итак, я просто добавил таймер для всего, что я хотел. –

+0

Вы можете уменьшить «seated.isSeated == true && Drinks.drinksOrdered == false || Drinks.drinksOrdered == true && seated.isSeated == false" to "seated.isSeated! = Drinks.drinksOrdered" –

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