Как исправить ошибку недопустимого термина выражения » = » в Unity/C#?

#c# #unity3d

Вопрос:

Хейо, не очень знаком с C#, тем более с Unity, и я, по-видимому, делаю что-то не так, вот мой код, единственная ошибка, которую я получаю, это:

‘Недопустимый Термин Выражения «=»‘

 bool currentlydown; // further up the script void Start() {  currentlydown = false;  } // later up the script void Update() { if ((Input.GetKeyDown("W") || Input.GetKeyDown("A") || Input.GetKeyDown("S") || Input.GetKeyDown("D")) amp;amp; currentlydown === false) {  anim.SetBool("Walking", true);  currentlydown = true;  } else if (!(Input.GetKeyDown("W") || Input.GetKeyDown("A") || Input.GetKeyDown("S") || Input.GetKeyDown("D")) amp;amp; currentlydown === true){  anim.SetBool("Walking", false);  currentlydown = false;  }  }  

Мы ценим любую и всяческую помощь!

Ответ №1:

  • Вы используете === (я полагаю, из JavaScript?). В C# нет === только оператора == .
  • JavaScript должен === требовать, чтобы типы операндов также были строго одинаковыми. C# имеет статическую типизацию, и большинство типов напрямую не сопоставимы, поэтому === оператор не требуется.
  • Кроме того, при сравнении ссылочного типа ( object , string , и т. д.), == оператора (по умолчанию) только проверяет, что оба операнда (т. е. ссылки) указывают на один и тот же объект в памяти (Почти-но-не-вполне указатель-сравнение), которая в обязательном порядке подразумевает типы являются одинаковыми, даже если бросить в различных справочно-типы:
     interface IFoobar {} class Foobar : IFoobar {};  Foobar a = new Foobar(); Object b = a; IFoobar c = a;  // Even though `a` and `b` have different reference-types (`Object` vs `IFoobar`) they point to the same object in-memory, so a type-check is unnecessary. Console.WriteLine( b == c ); // "true"  // Whereas with value-types you'll get a compiler error: Int32 x = 123; String y = "abc";  Console.WriteLine( x == y ); // lt;-- This won't compile because Int32 and String cannot be compared.  
  • Так что измените свой код для использования == .
  • Вы также можете упростить свою логику и сделать свой код более читабельным, переместив Input.GetKeyDown() проверки и сохранив их в локальном bool isWasd хранилище .

Вот так:

 bool currentlydown; // further up the script void Start() {  currentlydown = false; }  // later up the script void Update() {   bool isWasd = Input.GetKeyDown("W")  ||  Input.GetKeyDown("A")  ||  Input.GetKeyDown("S")  ||  Input.GetKeyDown("D");   if( isWasd amp;amp; currentlydown == false )  {  anim.SetBool("Walking", true);  currentlydown = true;  }  else if ( !(isWasd) amp;amp; currentlydown == true ){  anim.SetBool("Walking", false);  currentlydown = false;  } }  
  • При работе со bool System.Boolean значениями () вам не нужно делать if( boolValue == true ) или if( !(boolValue == true) ) или if( boolValue == false ) , вы можете делать if( boolValue ) и if( !boolValue ) .

Вот так:

 // later up the script void Update() {  bool isWasd =  Input.GetKeyDown("W")  ||  Input.GetKeyDown("A")  ||  Input.GetKeyDown("S")  ||  Input.GetKeyDown("D");   if( isWasd amp;amp; !currentlydown)  {  anim.SetBool("Walking", true);  currentlydown = true;  }  else if( !isWasd amp;amp; currentlydown )  {  anim.SetBool("Walking", false);  currentlydown = false;  } }  

Комментарии:

1. Спасибо! Я был сбит с толку тем, почему он не установил bool, я думал, что с помощью C# он использовал’===’, думаю, это с тех пор, как я создавал своего бота discord, очень благодарен.