Чи відрізняється C # в Unity?


18

Чи Unity використовує іншу версію C #, чи все однаково? Це виглядає інакше, ніж звичайний C #, але в ньому є деякі звичайні елементи C #.


4
Які відмінності ви бачите?
Анко

Я підозрюю, що зміни, на які ви посилаєтесь, - це рамкові відмінності, а не мова C #. У Unity3d ви використовуєте рамки .Net (через Mono) та елементи рамки Unity з мовою C #.
Майк Б

Це просто дуже стара версія. Якщо ви хочете останню версію C # і Mono і хочете програмувати , а не сценарій заздалегідь зробив двигун, а потім розглянути що - щось на зразок monogame.net
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 #
  • Вони використовують цілий ряд спеціальних методів для цих компонентів, таких як "Пуск" та "Оновлення", які не змінюються, як можна було б очікувати, але отримують доступ за допомогою рефлексії.

Практично кажучи, найбільша особливість мови C #, яку я сумую в поточній версії C # Unity, - це підтримка асинхронізації та пов’язані з цим ключові слова та функціональність. Аналогічне поняття в Unity - це супроводи . Вони виконуються на головному потоці, тому не є істинною асинхронією, але дозволяють розбивати тривалий код на кілька кадрів. Багаторівневе нанизування нижнього рівня все ще підтримується.


2
Просто для уточнення, asyncв C # також не відповідає справжньому асинхронізації, як у багатопотоковому - він також працює на головній нитці. Найбільші відмінності, з точки зору використання, між спрощеннями та асинхронією - це час виконання коду.
реге

Спасибі. Так, async! = Багатопотокове, хоча я б сказав, що набагато частіше використовувати async для приховування / взаємодії з багатопотоковими операціями, ніж це було б робити те ж саме з підпрограмами. Я написав програму-обгортку, яка починає завдання делегування на потоковий пул, що дає мені дуже схожий рівень гнучкості, але я все одно не заперечую, щоб мати «належну» підтримку для асинхронізації. Звичайно, гідний сучасний GC був би ще кращим;)
FlintZA

21

Unity 4 використовує Mono 2.6 , що є повною реалізацією рамки .NET, включаючи мову C #.

Я не впевнений, як це виглядає інакше, але майте на увазі, що Unity підтримує декілька мов, всі вони працюють над тим же Mono часом виконання. Чи можливо ви плутаєте C # з UnityScript ?


10
Додамо, Mono 2.6 з точки зору мовних особливостей еквівалентний C # 3.0. Mono 2.6.1 почав додавати функції C # 4.0.
Купер

Ось приємний огляд монологічної сумісності Unity станом на v4.1.2
Келлі Томас

Він відстає не тільки незначним , але головна версія надбавки: mono-project.com/Release_Notes_Mono_3.4
Den

3

Єдність використовує звичайний C #.

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

  • Більш конкретні області .Net, що стосуються Windows Forms та ASP, виходять за межі Unity.

  • Хоча ви можете використовувати Visual Studio для редагування та помилок часу компіляції, ви повинні створити та запустити в ID Unity.

  • Unity використовує Mono, що є реалізацією з відкритим кодом .Net, а значить, є невеликі відмінності.


Щоб розширити свою другу кулю - ви також можете налагоджувати програму в Visual Studio за допомогою UnityVS . Microsoft нещодавно придбала розробників, щоб вони найближчим часом безкоштовно випустили плагін.
mrohlf

Вибачте, але це майже ніколи не є звичайним C #.
Альпер

0

На питання, чи відрізняється версія C # від Unity від "звичайної" C #, відповіли інші публікації. Оскільки ви явно просите певні елементи, які можуть відрізнятися від такої звичайної версії, я поділюсь лише незначною різницею, яку я помітив, порівнюючи C #, який я використовую на роботі (наприклад, C # 4.0 в Visual Studio 2010 і вище) та C # в Unity, який полягає в тому, що я не можу використовувати значення за замовчуванням для параметрів у визначеннях функції. що полягає в тому, що вам потрібно більш ретельно налаштувати свій проект, щоб використовувати новішу версію C #. Дивіться це посилання для подальшого пояснення.

Редагувати: Я залишаю цю відповідь, оскільки наскільки я знаю, це непорозуміння, яке трапляється з досить великою кількістю людей.


Оскільки ця функція була додана лише до C # у версії 4.0 і раніше її не було, її відсутність справді не можна назвати "різницею" до "C #".
АБО Mapper

1
C # Версія 4 була випущена в 2010 році. Я думаю, що багато людей її використовують і відчувають, як я, її відсутність при програмуванні в Unity.
Несуно

Ви впевнені, що не можете використовувати значення за замовчуванням? Я впевнений, що я маю і маю ...
NPSF3000

Добре я спробував, і він не складе повідомлення з повідомленням, що я не можу використовувати значення за замовчуванням. Використовуєте спеціальну версію Unity? Подобається версія Pro?
Несуно

1
Ви можете абсолютно використовувати значення за замовчуванням, і це не має нічого спільного з pro чи not-pro. Unity та MonoDevelop мають дивні стосунки. Автомобілізовані проекти в MonoDevelop часто встановлюються на більш ранніх версіях C #, які не підтримують значення за замовчуванням. Однак якщо змінити цю настройку в проекті, вона буде працювати чудово. Якщо ви ігноруєте компіляцію в MonoDevelop і просто повертаєтесь до Unity, ви зауважите, що Unity не скаржиться на параметри за замовчуванням.
MrCranky
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.