C#在Unity中是否有所不同?


18

Unity是使用其他版本的C#,还是全部相同?它看起来与常规C#不同,但其中包含一些常规C#元素。


4
您看到什么区别?
Anko 2014年

我怀疑您所指的更改是框架差异,而不是C#语言。在Unity3d中,您将使用.Net框架(通过Mono)和特定于Unity的框架元素以及C#语言。
Mike B

这只是一个非常旧的版本。如果你想要最新版本的C#和Mono,并希望程序,而不是脚本预制的引擎,然后再考虑像monogame.net
书斋

我注意到一些细微的库差异,例如,在Unity中,有一个Mathf类而不是Math类,用于数学函数。如果还有其他差异,我不会关注,但是那是最突出的。
Alex

@Alex System.Math仍然可用,并且显然比UnityEngine.Mathf 更快。因此,使用Unity版本的唯一真实原因是避免以大量性能为代价避免进行大量浮动转换。
FlintZA

Answers:


9

如其他答案所述,Unity 4.x使用基于Mono 2.6的Mono版本的修改版本

在大多数情况下,它与.Net 2.0兼容,尽管我没有设法找到Mono 2.6特定的兼容性列表。

它看起来与常规C#不同,但其中包含一些常规C#元素。

如您对问题的评论之一所述,这可能是由于Unity的特定脚本API而不是语言本身引起的。

例如,一个典型的Unity项目中的许多代码包含在一个名为MonoBehavior的类的子类中。这些是在Unity Editor环境中放置在GameObjects上的组件。这种体系结构导致C#代码在许多方面看起来与典型的C#代码不同(无论如何对我来说):

  • 在Unity 4发布之前,这些对象无法包含在名称空间中,因此它们始终位于全局名称空间中
  • 它们通过将字段公开(或使用SerializeField属性,但将其暴露给编辑器环境,但我发现很少有人使用此字段),这导致类上的公共字段数量异常多
  • Unity的隐私和大小写约定不遵循Microsoft的约定,因此对于“传统” C#开发人员来说,这看起来也很奇怪
  • 它们在这些组件上使用了许多特殊方法,例如“开始”和“更新”,这些方法并不像通常期望的那样被替代,而是通过反射来访问。

实际上,我在Unity当前的C#版本中缺少的最大C#语言功能是对异步以及相关关键字和功能的支持。在协程中类似的概念是协程。它们在主线程上执行,因此不是真正的异步,但是允许将长时间运行的代码分解为多个帧。仍支持较低级别的多线程。


2
需要澄清的是,async在C#中也不像在多线程中那样是真正的异步-它也运行在主线程上。从使用角度来看,协程和异步之间最大的不同是代码运行的时间。
暴走了

谢谢。是的,异步!=多线程,尽管我想说,使用异步来隐藏/与多线程操作进行交互要比对协程做得多。我已经编写了一个包装协程,可以在线程池上启动委托任务,这使我获得了非常相似的灵活性,但是我仍然不介意拥有“适当的”异步支持。当然,像样的现代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功能。
库珀

从v4.1.2开始,这是Unity的Mono兼容性的很好概述
Kelly Thomas

它落后不只是次要的,但一个主要版本增量:mono-project.com/Release_Notes_Mono_3.4
书斋

3

Unity使用常规C#。

再说一次,当您在Unity中编写C#时,将使用它们的许多库,但据我所知,除了下面列出的区别外,C#中所有可能的功能在Unity中都是可能的。

  • 通过Windows,与Windows窗体和ASP相关的.Net的更具体领域是禁止的。

  • 虽然可以使用Visual Studio进行编辑和编译时错误,但必须在Unity IDE中进行构建和运行。

  • Unity使用Mono是.Net的开源实现,这意味着存在细微差别。


为了扩展您的第二个要点,您还可以在Visual Studio中使用UnityVS进行调试。微软最近收购了开发人员,因此他们将在不久的将来免费发布该插件。
mrohlf 2014年

抱歉,但是与常规C#相比还差得远。
Alper 2015年

0

其他帖子回答了Unity使用的C#版本是否与“常规” C#不同的问题。既然你是明确要求可能从这样的普通版本不同,我将分享只有微小的差别比较在工作中的C#我使用的时候,我注意到(即C#4.0中的Visual Studio 2010及更高版本)的某些元素和C#的统一,这我不能在函数定义中使用默认值作为参数。这是您必须更仔细地设置项目才能使用更新版本的C#。有关更多说明,请参见此链接。

编辑: 我留下这个答案,因为据我所知,这是一个误解,发生在很多人身上。


由于该功能仅在4.0版中添加到C#中,并且以前不存在,因此,其缺失实际上不能称为与“ C#”的“差异”。
OR Mapper 2014年

1
C#版本4于2010年发布。我想很多人都在使用它,并且像我一样,感觉到在Unity中编程时它的缺失。
Nessuno 2014年

您确定不能使用默认值吗?我很确定我确实有并且拥有……
NPSF3000

好吧,我尝试过,它不会与一条消息一起编译,告诉我不能使用默认值。您使用的是Unity的特殊版本吗?喜欢专业版吗?
Nessuno 2014年

1
您可以绝对使用默认值,与pro或not-pro无关。Unity和MonoDevelop有着奇怪的关系。MonoDevelop中自动生成的项目通常设置为不支持默认值的C#早期版本。但是,如果您在项目中更改该设置,它将可以正常工作。如果您忽略MonoDevelop中的编译,而直接返回Unity,您将注意到Unity不会抱怨默认参数。
MrCranky 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.