我开始使用Unity3d进行游戏开发,我可以看到有3种支持的语言用于创建脚本:C#、unityscript和Boo。。。
尽管,从过去的网页设计经验来看,我显然使用了javascript,但经过几次尝试,我可以注意到Unity3d并没有真正完全支持脚本语言,一些元素(如new Date().valueOf()
)和方法中的一些其他语句(如属性arguments
)和许多其他语句将无法正常工作,而且,我的文件似乎不能有一个封装器方法来封装所有其他方法,比如:
(function (scope) {
function Start() {
...
}
...
}(this));
当使用像new Date().valueOf()
这样在JS中有效的东西时,我得到:
MissingMethodException:未找到方法:"System.DateTime.valueOf".Bo.Lang.Runtime.DynamicDispatching.MethodDispatcherFactory.ProduceExtensionDispatcher()
那么,也许编译器会将最初的"unityscript"代码转换为Boo语言?因此,也许Boo是正确的"原生"选择,也许unityscript本身不是开发unity3d应用程序的最佳方式?
我在想一种完全支持所有已知的原生类和方法的语言,它能毫无问题地工作吗?
很抱歉上面提到的任何错误,请告诉我你的想法。
Unity本身不使用"真正的"Javascript。请参阅:
http://forum.unity3d.com/threads/1117-Javascript-Version
UnityScript基于javascript 2.0。缺少了一些东西(switch语句等),但它们的速度是C++的一半,比Mozilla快得多。
一旦你习惯了,在"JS"中开发统一是非常快速和灵活的。。。当然,如果你要开发本机组件,或者用C语言连接任何东西,你需要使用C#(最终,C#并不难学习)。
如果你想成为Unity的开发人员并以此为基础建立职业生涯,请学习C#并使用它-不要在UnityScript上浪费时间。您可以在Unity之外使用C#进行编程。如果你的主要职业已经是(或将要)网络开发,那么继续使用javascript,因为最终C#和UnityScript具有相同的功能,但C#更广泛地用于游戏和应用程序编程。
我使用过的商店中的大多数资产都是C#,或者同时提供JS和C#。语言之间的混合会产生严重的依赖性问题,因为为了在任何一种语言中使用类,它必须已经按照Unity脚本加载顺序进行了处理。要在C#中使用Javascript定义的类,必须在处理C#脚本文件之前处理该脚本文件。如果javscript类稍后需要C#类中的某些内容,则必须找到解决方法,因为从javascript文件中根本无法实现。Unity有办法定义脚本顺序。
我想我会警告你不要把C#和UnityScript混合在一起,因为如果你不专注于其中一个,你就会遇到这个问题。最终,C#是介于VB和JavaScript等模棱两可的语言和C++等迂腐的语言之间的中间地带(我有大约10年的C/C++背景)。
你的标题"什么是最好的xxx"导致了固执己见的答案,但我试图在不主观的情况下给出最好的建议。C#将允许你继续,即使一年后Unity将离开。UnityScript/JavaScript只允许你成为一名网络开发人员。C#开发人员可以很容易地进入UnityScript/JavaScript,但反过来要困难得多(并非不可能,只是更困难)。
您应该使用c#。它是流行的、成熟的、.NET原生的。c是大团队使用的。学习c#在将来会很有用。Unity3D中的JS并不是前面提到的真正的JS,也没有人听说过Boo。
JS是Unity最常用的语言。但是该语言是在Mono中实现的,因此该实现中的任何限制也会影响Unity脚本。
我不知道JS的Mono实现是如何工作的,但从错误消息来看,它至少使用了最初为Boo定义的数据类型。然而,这并不意味着JS"变成了Boo"。两者都被编译成相同的字节码,该字节码是JIT’ed并由Mono运行时运行。因此,两种语言都不比另一种语言"更地道"。
从这里查看使用c#和Java脚本的优点和缺点。C#比JavaScript快一点,并且您可以获得C#提供的额外功能。你可以从这里得到人们的意见。
使用c#进行开发具有Visual Studio 2010的优势。它提供了比Mono开发更好的代码完成功能。
仅在JavaScript中,变量可以具有未指定的类型。只有在声明变量时未赋值时才会发生这种情况。
动态类型变量的性能较慢,并且可能会遇到强制转换问题。如果这是一个问题,请使用#pragma strict。