O C # é diferente no Unity?

18

O Unity usa uma versão diferente do C # ou é tudo a mesma coisa? Parece diferente do C # regular, mas existem alguns elementos C # regulares lá.

kprovost7314
fonte
4
Que diferenças você vê?
Anko
Eu suspeito que as alterações às quais você está se referindo são diferenças de estrutura e não a linguagem C #. No Unity3d, você está usando a estrutura .Net (Via Mono) e os elementos específicos da estrutura da Unity com a linguagem C #.
18715 Mike
É apenas uma versão muito antiga. Se você quiser a última versão do C # e Mono e quer programa em vez de script de um motor pré-fabricados, então considerar algo como monogame.net
Den
Notei pequenas diferenças na biblioteca, por exemplo, no Unity, há uma classe Mathf para funções matemáticas, em vez da classe Math. Não prestei atenção se houver outras diferenças, mas essa é a que se destacou.
187 Alex
O @Alex System.Math ainda está disponível e, aparentemente, é mais rápido que o UnityEngine.Mathf . Portanto, o único motivo real para usar a versão do Unity é evitar muitos lançamentos (flutuantes) .. ao custo de algum desempenho.
FlintZA

Respostas:

9

Conforme declarado em outras respostas, o Unity 4.x usa uma versão modificada do Mono com base no Mono 2.6

Na maioria das vezes, isso é compatível com o .Net 2.0 , embora eu não tenha conseguido rastrear uma lista de compatibilidade específica do Mono 2.6.

Parece diferente do C # regular, mas existem alguns elementos C # regulares lá.

Como mencionado em um dos comentários sobre sua pergunta, isso provavelmente se deve à API de script específica do Unity, e não à própria linguagem.

Como exemplo, muitos códigos em projetos típicos do Unity estão contidos nas subclasses de uma classe chamada MonoBehavior. Esses são os componentes descartados no GameObjects no ambiente do Unity Editor. Essa arquitetura leva ao código C # que parece diferente do código C # típico (pelo menos para mim) de várias maneiras:

  • Até o lançamento do Unity 4, esses objetos não podiam estar contidos nos namespaces, portanto, eles estão sempre no namespace global
  • Eles expõem os campos ao ambiente do editor, tornando-os públicos (ou usando o atributo SerializeField, mas acho que poucas pessoas o usam), o que leva a um número incomumente grande de campos públicos nas classes
  • As convenções de privacidade e caso da Unity não seguem as da Microsoft, portanto isso também pode parecer estranho para um desenvolvedor de C # "tradicional"
  • Eles usam vários métodos especiais nesses componentes, como Iniciar e Atualizar, que não são substituídos como seria de esperar, mas são acessados ​​por meio de reflexão.

Na prática, o maior recurso de linguagem C # que sinto falta na versão C # atual do Unity é o suporte a palavras-chave assíncronas e relacionadas e funcionalidade. Um conceito semelhante no Unity são as rotinas . Eles são executados no encadeamento principal, portanto não são assíncronos verdadeiros, mas permitem que códigos de execução longa sejam divididos em vários quadros. O multithreading de nível inferior ainda é suportado.

FlintZA
fonte
2
Apenas para esclarecer, asyncem C # também não é assíncrono verdadeiro como em multiencadeados - ele também roda no encadeamento principal. As maiores diferenças, de uma perspectiva de uso, entre corotinas e assíncronas são os horários em que o código é executado.
rhughes
Obrigado. Sim, async! = Multithread, embora eu diria que é muito mais comum usar async para ocultar / interagir com operações multithread do que seria fazer o mesmo com corotinas. Eu escrevi uma rotineira de wrapper que inicia tarefas delegadas em um pool de threads, o que me proporciona um nível de flexibilidade muito semelhante, mas eu ainda não me importaria de ter suporte a assíncrono "adequado". É claro que um GC moderna decente seria ainda melhor;)
FlintZA
21

O Unity 4 usa o Mono 2.6 , que é uma implementação completa da estrutura .NET, incluindo a linguagem C #.

Não sei ao certo como parece diferente, mas lembre-se de que o Unity suporta vários idiomas, todos os quais funcionam com o mesmo tempo de execução Mono. É possível que você esteja confundindo C # com UnityScript ?

Sergio
fonte
10
Para adicionar, o Mono 2.6 é equivalente ao C # 3.0 em termos de recursos de idioma. O Mono 2.6.1 começou a adicionar recursos do C # 4.0.
Cooper
Aqui está uma boa visão geral da compatibilidade mono do Unity a partir da v4.1.2
Kelly Thomas
Não fica apenas menor, mas um grande incremento da versão: mono-project.com/Release_Notes_Mono_3.4
Den
3

O Unity usa C # regular.

Então, novamente, quando você escreve C # no Unity, estará usando muitas bibliotecas, mas, tanto quanto eu sei, tudo o que é possível em C # é possível no Unity, exceto as diferenças listadas abaixo:

  • Áreas mais específicas do .Net relacionadas ao Windows Forms e ASP estão fora dos limites através do Unity.

  • Embora você possa usar o Visual Studio para erros de edição e tempo de compilação, é necessário criar e executar no Unity IDE.

  • O Unity usa o Mono, que é uma implementação de código aberto do .Net, o que significa que existem pequenas diferenças.

Pontus Magnusson
fonte
Para expandir seu segundo marcador - você também pode depurar no Visual Studio usando o UnityVS . A Microsoft adquiriu recentemente os desenvolvedores para lançar o plug-in gratuitamente em breve.
Mrhlf
Desculpe, mas não está nem perto do C # regular.
Alper
0

A questão de saber se a versão C # usada pelo Unity é diferente de um C # "regular" foi respondida por outras postagens. Como você está solicitando explicitamente certos elementos que podem diferir de uma versão regular, compartilharei a única diferença menor que notei ao comparar o C # que uso no trabalho (por exemplo, o C # 4.0 no Visual Studio 2010 e posterior) e o C # no Unity, que é que não posso usar valores padrão para parâmetros nas definições de função. ou seja, você precisa configurar seu projeto com mais cuidado para usar uma versão mais recente do C #. Veja este link para mais explicações.

Edit: Deixo esta resposta, pois, tanto quanto sei, é um mal-entendido que acontece com muitas pessoas.

Nessuno
fonte
Como esse recurso foi adicionado apenas ao C # na versão 4.0 e não estava presente antes, sua ausência não pode realmente ser chamada de "diferença" para "C #".
OR Mapper
11
A versão 4 do C # foi lançada em 2010. Acho que muitas pessoas estão usando e sentem, como eu, sua ausência ao programar no Unity.
Nessuno
Tem certeza de que não pode usar valores padrão? Eu tenho certeza que eu faço e tenho ...
NPSF3000
Bem, eu tentei e não será compilado com uma mensagem dizendo que não posso usar valores padrão. Você está usando uma versão especial do Unity? Como a versão pro?
Nessuno
11
Você pode usar absolutamente valores padrão, e isso não tem nada a ver com pro ou não. Unity e MonoDevelop têm um relacionamento estranho. Os projetos gerados automaticamente no MonoDevelop geralmente são definidos para versões anteriores do C # que não suportam valores padrão. No entanto, se você alterar essa configuração no projeto, ela funcionará perfeitamente. Se você ignorar a compilação no MonoDevelop e simplesmente voltar ao Unity, notará que o Unity não reclama dos parâmetros padrão.
MrCranky