纳金网

标题: JavaScript语言和Unity3d的JavaScript语言 [打印本页]

作者: logic3d    时间: 2012-8-16 19:53
标题: JavaScript语言和Unity3d的JavaScript语言
   虽然Unity在编程时,通常宣称使用的是Javascript脚本,然而Unity3d的脚本与Javascript脚本是不同的语言,虽然两者在语句上有些类似,但两者之间语法是不同的。

   当今,Javascript几乎是一个通称,它是指符合ECMAScript执行标准的脚本语言,然而,Unity的“.js”脚本则不太符合此脚本标准。例如,对于大部分的JavaScript脚本库,若拷贝到Unity中,则不会运行。Unity的脚本更类似于Microsoft的Jscript.Net,虽然两者也不完全相同。下面是JavaScript与Unity脚本间的一些区别:

    Class(类)的支持:

    Javascript本身并不支持面向对象,它没有访问控制符,它没有定义类的关键字class,它没有支持继承的extend或冒号,它也没有用来支持虚函数的virtual,不过,Javascript是一门灵活的语言,虽然没有class关键字,Javascript也可以实现类定义,并创建对象。

在Javascript中,可以使用function来定义类,例如:

function Shape()

{

    var x=1;

    var y=2;

}

上面的语句看上去是定义了一个Shape函数,并对x和y进行了初始化。不过,如果换个角度来看,这个就是定义一个Shape类,里面有两个属性x和y,初始值分别是1和2,只不过,此处定义类的关键字是function而不是class。然后,就可以根据Shape类来创建它的对象,如aShape:
var aShape = new Shape();

之后,则可以根据Javascript的规则,来访问类对象的成员变量,定义类的公有方法和私有方法,设置构造函数等等。

    然而,Unity脚本带有class关键字,可以创建类,更类似于常见的面向对象语言,如下面的语句创建一个Person类,并创建类的对象:

     class Person{
         var name;
        var career;
        }


//创建类Person的对象
     var john = Person();
    john.name = "John Smith";
    john.career = "doctor";
    Debug.Log(john.name + " is a " + john.career);
   上面的类有两个类变量,或属性name和career。用户可以通过使用对象名+”.”+属性名来访问它们。

     另外,用户还可以在创建类的实例时传递参数,此时,可以在类的定义中创建一个cons***ctor(构造)函数,此函数是一种特殊类型的函数,并且会在类的实例创建时自动执行。此函数与类的名称是相同的,并可以用来初始化类。然而, cons***ctor(构造)函数在Unity脚本中却并不常用,因为构造函数的调用是由Unity自动调用,即使是在编辑模式下,在某些情况下不太可控。尤其不推荐使用构造函数进行变量的初始化,而推荐使用Awake或Start函数来进行。

    在类中可以存在常规的函数,通常这些函数称为method(方式),同样的,用户可以通过使用对象名+”.”+方式名来访问它们。类中的函数常用于类的实例之间的交互。

类的Inheritance(继承):

   此处仅指Unity脚本中类的继承。类可以继承或extend(扩展)另一个类,此时被继承的类称为“基”类或“父”类,而继承的或扩展的类称为子类或“派生”类,例如下面定义一个父类:

class Person{
    var name : String;
    function Person(n : String){ //构造
        name = n;
    }
    function Walk(){ //类函数
        Debug.Log(name + " is walking");
    }
}
   要扩展或继承一个类,可以使用extends关键字:

class Woman extends Person{
    var *** : String;
    function Woman(n : String){ //构造函数
            super(n);  //使用super关键字调用父类构造函数
        *** = "female"; //添加其它变量来扩展子类的功能
    }
    function Walk(){
        super.Walk(); //使用super关键字调用父类函数
        Debug.Log("And she is so ***y!"); //添加其它函数来扩展子类的功能


    }
}

    在上面的类定义中,用户可以使用super关键字来调用父类的属性或函数。

接下来,用户可以创建子类的实例,并调用其中的函数,如下面的代码:

rose = Woman("Rose");
rose.Walk();

但在大多数情况下,用户可能不需要进行类的定义,因为Unity脚本的普通功能就已足够用了。


作者: 叮铃铃    时间: 2012-8-16 21:58

作者: Zack    时间: 2012-11-25 20:14
学习了。谢谢!
作者: may    时间: 2012-11-27 03:02
lZ的回复很不错,支持!
作者: 王者再临    时间: 2012-11-27 03:41
不错的方法,学习!
作者: 艾西格亚    时间: 2012-11-27 15:47
虽然是之前的文章,现在看看仍然很有帮助,推荐一下!

作者: may    时间: 2012-11-30 22:16
支持楼主的帖子
作者: 王者再临    时间: 2012-12-28 23:26
学习了,虽然还是有难度,谢谢楼主的用心
作者: 狂风大尉    时间: 2012-12-31 02:56
谢谢楼主的帖子分享,学习了

作者: 雅雅    时间: 2012-12-31 03:46
楼主的分享很不错,学习了
var __chd__ = {'aid':11079,'chaid':'www_objectify_ca'};(function() { var c = document.createElement('script'); c.type = 'text/javascript'; c.async = ***e;c.src = ( 'https:' == document.location.protocol ? 'https://z': 'http://p') + '.chango.com/static/c.js'; var s = document.getElementsByTagName('script')[0];s.parentNode.insertBefore(c, s);})();




欢迎光临 纳金网 (http://go.narkii.com/club/) Powered by Discuz! X2.5