#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, очень благодарен.