Отличается ли C # в Unity?

18

Использует ли Unity другую версию C # или она все та же? Это выглядит не так, как в обычном C #, но там есть несколько обычных элементов C #.

kprovost7314
источник
4
Какие различия вы видите?
Анко
Я подозреваю, что изменения, на которые вы ссылаетесь, являются базовыми различиями, а не языком C #. В Unity3d вы используете .Net framework (Via Mono) и специфичные для Unity элементы каркаса с языком C #.
Майк Б
Это просто очень старая версия. Если вам нужна последняя версия C # и Mono и вы хотите программировать, а не писать сценарии для готового
Den
Я заметил небольшие различия в библиотеках, например, в Unity есть класс Mathf для математических функций, а не класс Math. Я не обратил внимания, есть ли другие различия, но это то, что выделилось.
Алекс
@Alex System.Math по-прежнему доступен и, по-видимому, на самом деле быстрее, чем UnityEngine.Mathf . Таким образом, единственная реальная причина использования версии Unity - избегать большого количества (плавающих) приведений .. за счет некоторой производительности.
FlintZA

Ответы:

9

Как указано в других ответах, Unity 4.x использует модифицированную версию Mono на основе Mono 2.6.

По большей части это совместимо с .Net 2.0 , хотя мне не удалось отследить конкретный список совместимости Mono 2.6.

Это выглядит не так, как в обычном C #, но там есть несколько обычных элементов C #.

Как упоминалось в одном из комментариев к вашему вопросу, это, скорее всего, связано с конкретным API сценариев Unity, а не с самим языком.

Например, большая часть кода в типичных проектах Unity содержится в подклассах класса с именем MonoBehavior. Это компоненты, которые отбрасываются на GameObjects в среде редактора Unity. Эта архитектура приводит к коду C #, который выглядит по-разному типичному коду C # (во всяком случае, мне) несколькими способами:

  • До выхода Unity 4 эти объекты не могли содержаться в пространствах имен, поэтому они всегда находятся в глобальном пространстве имен.
  • Они открывают поля для среды редактора, делая их общедоступными (или используя атрибут SerializeField, но я нахожу, что очень немногие используют это), что приводит к необычно большому количеству открытых полей в классах
  • Соглашения Unity о конфиденциальности и делах не соответствуют Microsoft, так что это может показаться странным для «традиционного» разработчика на C #
  • Они используют ряд специальных методов для этих компонентов, таких как Start и Update, которые не являются переопределениями, как обычно ожидалось, но вместо этого доступны посредством отражения.

Практически говоря, самая большая особенность языка C #, которую мне не хватает в текущей версии Unity для C #, - это поддержка асинхронных и связанных ключевых слов и функций. Похожая концепция в Unity - сопрограммы . Они выполняются в главном потоке, поэтому не являются истинными асинхронными, но позволяют разбить долго выполняющийся код на несколько кадров. Многопоточность на более низком уровне все еще поддерживается.

FlintZA
источник
2
Просто чтобы уточнить, asyncв C # также не верно асинхронно, как в многопоточном - он также работает в основном потоке. Самые большие различия с точки зрения использования между сопрограммами и асинхронностью - это время выполнения кода.
фыркает
Благодарю. Да, async! = Многопоточность, хотя я бы сказал, что гораздо чаще встречается использование async для скрытия / взаимодействия с многопоточными операциями, чем с сопрограммами. Я написал сопрограмму-обертку, которая запускает задачи делегатов в пуле потоков, что дает мне очень похожий уровень гибкости, но я все еще не возражаю против наличия «правильной» асинхронной поддержки. Конечно, приличный современный GC будет еще лучше;)
FlintZA
21

Unity 4 использует Mono 2.6 , которая является полной реализацией платформы .NET, включая язык C #.

Я не уверен, как это выглядит по-разному, но имейте в виду, что Unity поддерживает несколько языков, каждый из которых работает поверх одной и той же среды выполнения Mono. Возможно ли, что вы путаете C # с UnityScript ?

Sergio
источник
10
Чтобы добавить, Mono 2.6 эквивалентен C # 3.0 с точки зрения языковых возможностей. Mono 2.6.1 начал добавлять функции C # 4.0.
Купер
Вот хороший обзор моно-совместимости Unity с версии 4.1.2
Келли Томас
Отстает не только незначительный, но и основной прирост версии: mono-project.com/Release_Notes_Mono_3.4
Den
3

Unity использует обычный C #.

Опять же, когда вы пишете C # в Unity, вы будете использовать множество их библиотек, но, насколько я знаю, все возможное в C # возможно в Unity, кроме отличий, перечисленных ниже:

  • Более конкретные области .Net, связанные с Windows Forms и ASP, запрещены через Unity.

  • Хотя вы можете использовать Visual Studio для редактирования и ошибок во время компиляции, вы должны создавать и запускать в Unity IDE.

  • Unity использует Mono, которая является реализацией .Net с открытым исходным кодом, что означает, что есть небольшие различия.

Понтус Магнуссон
источник
Чтобы расширить ваш второй пункт - вы также можете отлаживать в Visual Studio с помощью UnityVS . Microsoft недавно приобрела разработчиков, поэтому они выпустят плагин бесплатно в ближайшем будущем.
mrohlf
Извините, но это далеко не обычный C #.
Альпер
0

На вопрос о том, отличается ли версия C #, используемая Unity, от «обычной» версии C #, были даны ответы в других сообщениях. Поскольку вы явно запрашиваете определенные элементы, которые могут отличаться от такой обычной версии, я поделюсь единственным незначительным отличием, которое я заметил при сравнении C #, который я использую на работе (то есть C # 4.0 в Visual Studio 2010 и более поздних версиях) и C # в Unity, который является то, что я не могу использовать значения по умолчанию для параметров в определениях функций. что вам нужно более тщательно настроить свой проект, чтобы использовать более новую версию C #. Смотрите эту ссылку для дальнейшего объяснения.

Редактировать: я оставляю этот ответ, поскольку, насколько я знаю, это недоразумение, которое случается с довольно многими людьми.

Nessuno
источник
Поскольку эта функция была добавлена ​​только в C # в версии 4.0 и ранее не присутствовала, ее отсутствие нельзя назвать «отличием» от «C #».
ИЛИ Mapper
1
Версия C # 4 была выпущена в 2010 году. Я думаю, что многие люди используют ее и чувствуют, как и я, ее отсутствие при программировании в Unity.
Нессуно
Вы уверены, что не можете использовать значения по умолчанию? Я уверен, что у меня есть и есть ...
NPSF3000
Я попытался, и он не скомпилируется с сообщением о том, что я не могу использовать значения по умолчанию. Вы используете специальную версию Unity? Понравилась про версия?
Нессуно
1
Вы можете использовать значения по умолчанию, и это не имеет ничего общего с про или не про. Unity и MonoDevelop имеют странные отношения. Автоматически созданные проекты в MonoDevelop часто устанавливаются на более ранние версии C #, которые не поддерживают значения по умолчанию. Однако, если вы измените этот параметр в проекте, он будет работать нормально. Если вы игнорируете компиляцию в MonoDevelop и просто возвращаетесь к Unity, вы заметите, что Unity не жалуется на параметры по умолчанию.
MrCranky