C # è diverso in Unity?


18

Unity utilizza una versione diversa di C # o è sempre la stessa? Sembra diverso dal normale C # ma ci sono alcuni elementi C # regolari.


4
Quali differenze vedi?
Anko,

Sospetto che le modifiche a cui ti riferisci siano differenze quadro e non il linguaggio C #. In Unity3d stai usando il framework .Net (Via Mono) e gli elementi del framework specifici di Unity con il linguaggio C #.
Mike B,

È solo una versione molto vecchia. Se vuoi l'ultima versione di C # e Mono e vuoi programmare piuttosto che creare
Den

Ho notato lievi differenze nella libreria, ad esempio in Unity esiste una classe Mathf per le funzioni matematiche, anziché la classe Math. Non ho prestato attenzione se ci sono altre differenze, ma è quella che si è distinta.
Alex,

@Alex System.Math è ancora disponibile e apparentemente in realtà è più veloce di UnityEngine.Mathf . Quindi l'unica vera ragione per usare la versione di Unity è evitare molti cast (float) ... a scapito di alcune prestazioni.
FlintZA,

Risposte:


9

Come indicato in altre risposte, Unity 4.x utilizza una versione modificata di Mono basata su Mono 2.6

Per la maggior parte, questo è compatibile con .Net 2.0 , anche se non sono riuscito a rintracciare un elenco di compatibilità specifico Mono 2.6.

Sembra diverso dal normale C # ma ci sono alcuni elementi C # regolari.

Come menzionato in uno dei commenti sulla tua domanda, ciò è probabilmente dovuto alla particolare API di scripting di Unity piuttosto che alla lingua stessa.

Ad esempio, molto codice in un tipico progetto Unity è contenuto in sottoclassi di una classe chiamata MonoBehavior. Si tratta di componenti rilasciati su GameObjects all'interno dell'ambiente Unity Editor. Questa architettura porta a un codice C # che sembra diverso dal tipico codice C # (per me comunque) in diversi modi:

  • Fino al rilascio di Unity 4, questi oggetti non potevano essere contenuti negli spazi dei nomi, quindi sono sempre nello spazio dei nomi globale
  • Espongono i campi all'ambiente dell'editor rendendoli pubblici (o usando l'attributo SerializeField, ma trovo che pochissime persone lo utilizzino), il che porta a un numero insolitamente elevato di campi pubblici nelle classi
  • Le convenzioni sulla privacy e sui casi di Unity non seguono quelle di Microsoft, quindi questo può anche sembrare strano per uno sviluppatore C # "tradizionale"
  • Usano una serie di metodi speciali su questi componenti, come Start e Update, che non sono sostituiti come ci si aspetterebbe in genere, ma sono invece accessibili mediante la riflessione.

In pratica, la più grande caratteristica del linguaggio C # che mi manca nell'attuale versione C # di Unity è il supporto per le parole chiave async e relative e funzionalità. Un concetto simile in Unity sono le coroutine . Questi vengono eseguiti sul thread principale, quindi non sono veri asincroni, ma consentono la suddivisione del codice in esecuzione su più frame. Il multithreading di livello inferiore è ancora supportato.


2
Giusto per chiarire, asyncin C # non è nemmeno vero asincrono come in multi-thread - funziona anche sul thread principale. Le maggiori differenze, dal punto di vista dell'utilizzo, tra coroutine e asincrono sono i tempi di esecuzione del codice.
rhughes,

Grazie. Sì asincrono! = Multithread, anche se direi che è molto più comune usare asincrono per nascondere / interagire con operazioni multithread di quanto sarebbe fare lo stesso con le coroutine. Ho scritto un programma di wrapper che dà il via a compiti delegati su un threadpool che mi dà un livello di flessibilità molto simile, ma ancora non mi dispiacerebbe avere un supporto asincrono "adeguato". Naturalmente un GC moderno decente sarebbe ancora meglio;)
FlintZA,

21

Unity 4 utilizza Mono 2.6 , che è un'implementazione completa del framework .NET, incluso il linguaggio C #.

Non sono sicuro di come appaia diverso, ma tieni presente che Unity supporta diverse lingue, che funzionano tutte sullo stesso runtime Mono. È possibile che stai confondendo C # con UnityScript ?


10
Per aggiungere, Mono 2.6 equivale a C # 3.0 in termini di funzionalità del linguaggio. Mono 2.6.1 ha iniziato ad aggiungere funzionalità di C # 4.0.
Cooper

Ecco una bella panoramica della compatibilità mono di Unity dalla v4.1.2
Kelly Thomas,

Non è solo minore ma un incremento della versione principale: mono-project.com/Release_Notes_Mono_3.4
Den

3

Unity utilizza C # normale.

Inoltre, quando scrivi C # in Unity utilizzerai molte delle loro librerie, ma per quanto ne so, tutto ciò che è possibile in C # è possibile in Unity, ad eccezione delle differenze elencate di seguito:

  • Le aree più specifiche di .Net relative a Windows Form e ASP sono vietate tramite Unity.

  • Sebbene sia possibile utilizzare Visual Studio per errori di modifica e di compilazione, è necessario creare ed eseguire l'IDE di Unity.

  • Unity utilizza Mono, che è un'implementazione open source di .Net, il che significa che ci sono lievi differenze.


Per espandere il secondo proiettile, è anche possibile eseguire il debug in Visual Studio utilizzando UnityVS . Microsoft ha recentemente acquisito gli sviluppatori, quindi rilasceranno il plug-in gratuitamente nel prossimo futuro.
mrohlf,

Ci dispiace ma non è affatto vicino al normale C #.
Alper,

0

La domanda se la versione C # utilizzata da Unity sia diversa da un C # "normale" ha ricevuto risposta da altri post. Dal momento che stai chiedendo esplicitamente alcuni elementi che potrebbero differire da una versione così regolare, condividerò l'unica differenza minore che ho notato confrontando il C # che uso al lavoro (ad esempio C # 4.0 in Visual Studio 2010 e versioni successive) e C # in Unity, che è che non riesco a utilizzare i valori predefiniti per i parametri nelle definizioni delle funzioni. che è necessario impostare il progetto con maggiore attenzione al fine di utilizzare una versione più recente di C #. Vedi questo link per ulteriori spiegazioni.

Modifica: lascio questa risposta dal momento che so che questo è un malinteso che accade a molte persone.


Dato che quella funzione era stata aggiunta a C # solo nella versione 4.0 e non era presente prima, la sua assenza non può davvero essere definita una "differenza" rispetto a "C #".
OR Mapper,

1
La versione 4 di C # è stata rilasciata nel 2010. Penso che molte persone lo stiano usando e sentano, come me, la sua assenza durante la programmazione in Unity.
Nessuno,

Sei sicuro di non poter utilizzare i valori predefiniti? Sono abbastanza sicuro di averlo fatto e ...
NPSF3000,

Beh, ho provato e non si compila con un messaggio che mi dice che non posso usare i valori predefiniti. Stai utilizzando una versione speciale di Unity? Ti piace la versione pro?
Nessuno,

1
Puoi assolutamente usare i valori predefiniti, e non ha nulla a che fare con pro o non-pro. Unity e MonoDevelop hanno una relazione strana. I progetti generati automaticamente in MonoDevelop sono spesso impostati su versioni precedenti di C # che non supportano i valori predefiniti. Tuttavia, se si modifica tale impostazione nel progetto, funzionerà perfettamente. Se ignori la compilazione in MonoDevelop e torni semplicemente su Unity, noterai che Unity non si lamenta dei parametri predefiniti.
MrCranky,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.