Unity教程之-Unity3D中JavaScript与C#对比

 

在使用unity3d进行游戏开发或者互动项目制作的时候,有3种编辑语言可供使用,不过用的最多的应该是javascript和c#两种语言,相信很多朋友特别是新手都会很纠结于到底该用二者种的哪一个比较好,下面是老外对unity3d中这两种语言进行的一个整体有效的对比,此为第一章节,主要对比二者在变量,类,函数等常规基础要点上的异同!

本篇文章主要讨论在Unity3d引擎中使用JavaScript和C#编程是有什么不同。所有在文章里用到的脚本都可以在本系列的最后一章中下载到,那么现在我们就来看看这两种语言之间到底有什么不同。 第一个也是最容易区分的一点就是声明变量和方法。在JavaScript编程中,不用像C#中一样,必须声明变量或方法类型,因为JavaScript是一种弱类型语言,在编译时他会选择最合适的类型给予定义。但是C#完全不同,它属于强类型语言,变量或方法一定要在之前定义好。或许看些例子可以让我们更好的理解这个概念。下面是一个JavaScript的脚本:


private var cubeTransform;

在C#中,同样的代码则会是:


private Transform cubeTransform;

这对方法同样适用,在C#中,一个方法什么值也没有返回,那么他的返回值为 void 类型,但是在JavaScript中则可以省略。

类的继承也是不同的。在JavaScript和C#中,方法是隐型并且不可重载,除非方法声明中添加虚拟关键字。不同的是C#只重载那些包含重载关键字的方法。而JavaScript不需要关键词,只要重载类方法就可继承他们。我们来看一个JavaScript类继承的例子:


class Weapon extends Item
{
//Class members and declarations
}

在C#中,同样的代码则会是:


public class Weapon : Item
{
//Class members and declarations
}

这就是这两种代码的主要区别,实际上他需要定义全部的东西,像执行产出代码,访问GameObject和组件,激光投射等等。还有一些其他的不同点,比如导入函数库的关键字(在JavaScript中用“Import”,在C#中使用“using”),但是这些声明和关键字的不同就比较容易明白了。

所以,如果读者可以理解这些不同点,那在下面的章节中的解释也会更加容易理解。

最后提一下:在JavaScript中,即使不必要声明变量和方法类型,但是劝你最好还是定义一下。虽说编译器会试图找出你变量的类型,但是如果你没有声明,那就有可能会出现一些问题,比如:


//do this:
private var score:int;
//instead of this:
private var score;

虽说每分钟都不停地读代码不是什么问题,但是也不要忘了,现在游戏每秒钟运行60帧,当然Unity3D也不例外,这样的话,当你的JavaScript脚本运行时就会无时无刻不在给Unity3D增加变量类型。

下面我们看下如何访问GameObject和组件,这是一个程序员在编写Unity3D脚本时最常见的一个事。那么现在让我们先创建一个名称为“Pawn”的GameObject,并且给他附上“PawnMover”脚本。

使用JavaScript来获取GameObject很简单,你只需要调用Find()静态方法,并把想要的GameObject的名称作为参数:


private var pawnGO:GameObject;
function Awake()
{
pawnGO = GameObject.Find("Pawn");
}

用C#也很相似:


using UnityEngine;
using System.Collections;

public class PawnGetter : MonoBehaviour
{
private GameObject pawnGO;

void Awake ()
{
pawnGO = GameObject.Find("Pawn");
}
}

在不考虑两种语言的关键字和格式不同的情况下,代码是完全一样的(第一个代码的第四行和第二个代码的第八行是相同的)。不管代码是强类型还是弱类型,GameObject.Find()方法总是会返回一个GameObject值。

现在,让我们看看如何获得一个GameObject上的组件。假设“PawnMover”组件赋给“Pawn”GameObject,让我们来看看如何使用JavaScript获得“PawnMover”组件:


private var pawnGO:GameObject;
private var pmSC:PawnMover;
function Awake()
{
pawnGO = GameObject.Find("Pawn");
pmSC = pawnGO.GetComponent("PawnMover");
}

基本上,要获得“PawnMover”组件,我们所需要做的就是从“Pawn”GameObject调用GetComponent()方法,并把所需组件的名称作为参数。除了名称,我们也可以通过组件类型作为参数,但是像上面的例子我们用名字就行了。因为JavaScript是弱类型,返回值为组件,我们不需要把组件给PawnMover 类作为结果。在C#中也是一样的:


using UnityEngine;
using System.Collections;

public class PawnGetter : MonoBehaviour
{
private GameObject pawnGO;
private PawnMover pmSC;

void Awake()
{
pawnGO = GameObject.Find("Pawn");
//returns a CS0266 error
pmSC = pawnGO.GetComponent("PawnMover");//<=returns a CS0266 error
//this is the right way to do it when using C#
pmSC = pawnGO.GetComponent< PawnMover >();
}
}

用C#就不可能只是调用GetComponent()方法并把该组件的名称作为参数了,这样他会导致错误CS0266,也就是说C#不能从一个类型隐型转换为另一个格式。因为C#属于强类型,我们不能把组件类型转换为PawnMover类型。我们需要调用一个方法传递这个类型,强制GetComponent()方法返回“PawnMover”对象而不是组件。好了,本篇unity3d教程关于C#和JavaScript的对比介绍就到此结束,下篇我们继续!