unity3d用什么语言开发

2015年03月09日 10:52 0 点赞 0 评论 更新于 2025-11-21 16:46

Unity3D提供了三种可供选择的脚本编程语言:JavaScript、C#以及Boo。尽管它们各有优势与不足,但对我而言,C#显然会脱颖而出,成为我的首选。C#完整支持面向对象,并且其语法与Java以及ActionScript 3很类似,而这两种语言我都比较熟悉。不过在接触Unity3D之前,我一行C#代码都没写过,所以必须从头学起。

C#简介

C#由Microsoft提出,广泛应用于.NET framework以及Silverlight开发中。但需要明确的是,学习用于Unity3D的C#并不等同于学习.NET平台。实际上,你无需了解所有关于.NET的知识,就可以使用C#为Unity3D编写脚本程序。

我平时虽会使用各种在线文档,但实体书通常是更好的学习助手,于是我决定买一本关于C#的好书。O’Reilly C# Pocket Guide看起来正是我所需要的,购买一本500页的C#“圣经”并无必要,因为那些书中大部分内容都与.NET相关,无法与Unity3D兼容。

当然,仅依靠这一本书是不够的,你还需要经常查阅Unity3D scripting reference。文档中的所有例子都是用Javascript书写的,但不必担心,一旦你熟悉C#后,将这些例子翻译成C#语言轻而易举。

C#是一种非常优雅且强大的编程语言,它的点语法(dot - syntax)命名法则基于Java,所以如果你有Java编程背景,会感觉很适应。不过,两者也存在一些区别,最明显的是在C#中,属性以及方法的名称约定俗成以大写字母开头。我猜测这是继承自Visual Basic的习惯,我不太喜欢这种习惯,但为了保证代码的一致性,还是接受它更好。

C#的特性丰富,相比之下,ActionScript显得有些逊色。C#与Actionscript本质上极为相似,我预计下一次ActionScript升级时,至少会实现C#的一些特性,因此有必要提前了解C#的特性。下面是我比较喜欢的一些特性。

运算符重载

这是目前最酷的特性之一!它允许程序员为 +、-、*、/ 这样的运算符定义特殊的行为。在向量加法运算中,其优势体现得尤为明显。在ActionScript中,要计算向量之和,需要编写类似下面的代码:

var c:Vector3D = a.add(b);

当有多于两个向量相加时,代码的可读性会变得很差。而在C#中重载 + 运算符后,代码会变成下面的形式:

Vector3 c = a + b;

这样的代码可读性更好,也更为优雅。可以猜到,在Unity3D中,所有向量的运算符都进行了重载。如果你想自己实现运算符重载,也非常简单,对于上面的例子,代码大致如下:

public static Vector3 operator + (Vector3 a, Vector3 b)
{
return new Vector3(a.x + b.x, a.y + b.y, a.z + b.z);
}

运算符重载有一些简单的规则:运算符函数必须是静态的(static),并且需要返回它所定义的对象类型。其参数可以是任何类型,因此完全可以重载加法或乘法运算符,使其支持向量与浮点数或者与矩阵的运算,这都得益于C#对运算符重载功能的支持。

方法重载

方法重载允许我们定义多个同名但参数不同的方法。它不仅适用于一般方法,也可应用于构造函数。如果有多种途径来初始化一个对象,就可以为每一种途径定义一个专有的构造函数。而且方法重载同样可以应用于运算符方法。

在Unity3D API中,“Transform.Rotate()” 方法就是一个关于方法重载的很好例子,它被重载了三次以满足不同的旋转参数:

void Rotate (Vector3 eulerAngles, Space relativeTo);
void Rotate (float xAngle, float yAngle, float zAngle, Space relativeTo);
void Rotate (Vector3 axis, float angle, Space relativeTo);

你可以指定欧拉角,也可以指定旋转轴以及旋转角度。

ActionScript可以使用默认参数来模拟方法重载,但这样做既不方便也不易理解。

Getter/Setter语法

C#声明参数的方法简明扼要。在ActionScript中需要两个方法——一个 “get” 和一个 “set”,而在C#中的代码则如下:

public float Size { get; set; }

这种情况下,编译器会自动创建一个私有属性。当然,这样简单的定义用处不大,下面是一个稍微复杂点的例子,包括一个public的get以及private的set:

public float Area
{
get { return size * size; }
private set { size = Mathf.Sqrt(value); }
}

值得注意的是,尽管C#源自Java,但在C#中并不使用 “function” 和 “var” 关键词,这样做是因为这两个关键词完全是冗余的,不会为代码增加有价值的信息。

对于C#的其他特性,如索引器(indexers)、泛型类型(generic types)、结构体(structures)以及枚举器(enumerators),在上面提到的C# Pocket Book中有详细介绍,许多C#教程中也有涉及。

C#编辑器

很多编辑器都支持C#。微软提供的Visual C# Express Edition免费且好用,支持代码自动补完功能,但仅适用于Windows平台。对于Mac平台,Mono Develop看起来功能强大,但还不够稳定。不幸的是,Eclipse的C# plugin目前非常不稳定,所以我不推荐使用,不过它目前还处于Alpha阶段,我们可以多给它一些时间。当然,最后我们至少还可以使用TextMate。

最后要提到的是Unitron——Unity3D自带的默认编辑器。在开发者中它不太流行,有人抱怨它功能过于基础,我并不认同这种观点。虽然它不如FDT之于ActionScript那样强大,但它非常稳定,并且具备基本的代码自动补完功能。有趣的是,自动补完功能在默认设置下是关闭的,要开启该功能需要打开 “Preferences”,在 “General” 面板的底端可以找到这个选项,开启后我认为Unitron还是值得一用的。

很多人是在浏览器环境下认识Javascript的,Javascript也是很多人学习的第一门编程语言。如果是这种情况,你可能会立即开始使用Javascript进行Unity3D编程,而不必操心学习新东西。毕竟,如Unity3D所说,任何使用C#可以完成的事,同样可以使用Javascript完成。

但从长远来看,C#可以提供更好的代码管理、完整的面向对象编程(OOP)支持、强类型(strong typing)以及掌握一门优秀编程语言所带来的成就感。因此,额外付出努力学习C#是值得的。更何况,对于一个经验丰富的AS3开发者来说,掌握C#只需几个礼拜的时间,现在就动手尝试一下吧!

作者信息

boke

boke

共发布了 3994 篇文章