自从开通了公众号之后,有更多的朋友加我qq来交流问题。这是一个好的事情。在交流的过程中,我发现很多朋友都比较缺乏程序的基础,但又急着拿Unity来做一些作品之类的。所以经常会遇到一些很入门的问题没有办法解决。这些问题基本都几种在写代码的过程中。然后回顾一下之前的文章,感觉都是从美术资源的优化角度去介绍Unity的。所以接下来我打算写一些关于程序方面的事情。
前两篇都是针对程序基础比较薄弱的入门者的,所以老鸟们可以直接跳过了。这一篇会讲怎样去查Unity的API,下一篇会讲怎样代码查错。希望通过2篇文章,可以教会入门者正确的学习和查错的方法,减少为了入门问题而到处问人的时间。
首先,怎样打开Unity的API文档呢?
在Help菜单栏下面,有上图所示的两个选项,一个是Unity Manual 另外一个是Scripting Reference。
Unity Manual是用户手册,里面介绍了Unity的各种组件的界面操作和用法。
Scripting Reference是脚本手册,就是我们要查询的API了。
点击打开,可以看到是打开了一个网页。用户手册如果各位有兴趣,可以慢慢的去翻看里面的内容,这次我们主要是讲脚本手册的用法。
打开脚本手册之后,可以看到左边是一个命名空间的选择。如果不知道什么是命名空间可以去自己百度一下。大致分为UnityEngine、UnityEditor和Other这3类。我们在使用Unity做东西的时候,一般是使用UnityEngine命名空间里面的类和方法,这是可以发布应用之后还能执行的。UnityEditor命名空间里面的类只能用于Unity编辑器内运行,比如写一些编辑器扩展插件或者工具之类,在发布应用之后是不能使用的。
在网页的右边,有2个需要我们注意的地方,一个是最右上角的搜索框,一般就是用得最多的地方了,我们想查询某个API的用法时,都可以直接在这里搜索,下面会详细说明。另外一个是搜索栏下面的脚本语言选择。有C#脚本和JS脚本2个选择。
插一句题外话,在这里我奉劝刚入门的人,不要去选择JS脚本来写Unity。不是说JavaScript比C#差,而是因为Unity支持的JS脚本,只是一个阉割版本的JS,具体能做的事情只是能把Unity最基本的API勉强用起来而已,很多真正JavaScript能做的事情,Unity的JS是做不到的。而C#却是完整版本的,你可以在Unity里面做到正常的C#能做到的各种事情,包括使用各种现成的类库等。
接下来我们开始具体的去看怎样查询API,比如我现在想查一下Unity很常用的一个叫做GameObject的类的内容和方法,我就可以在搜索栏里面输入GameObject,然后点查找的放大镜或者回车都可以,
看到搜索的结果了,它已经把包含GameObject的所有类或者方法都列举出来。
我们点进去第一个GameObject,就可以打开GameObject类的说明文档:
接下来我会说明一下这个这么长的一页文档里面各个部分具体表达的意思,随便讲一些最基层的关于程序里面的类的结构。
首先看第一个部分,这个部分其实包含了很多内容,首先可以看到红圈标记的两个地方:
class in UnityEngine:意思是这个GameObject的类是属于UnityEngine命名空间的。我们在写代码时如果需要用到GameObject这个类,有2种写法,第一种是在脚本的最开始的地方写入using UnityEngine,第二种方法是在使用到GameObject类的时候,在前面加上命名空间,比如UnityEngine.GameObject。
当然,在Unity编辑器里面创建的C#脚本,默认都已经有using UnityEngine,所以你理所当然的就可以直接使用GameObject类而不需要再额外写任何东西了。举一反三,如果以后遇到其他命名空间的类需要使用,你也就可以通过using 命名空间或者在类名前面加入命名空间.来使用。
Inherits form:Object :这个地方的含义是,GameObject这个类是继承了Object类的。也就是说GameObject的父类是Object类,或者说GameObject类是Object类的子类。继承是面向对象的一个特征,子类可以通过继承的方式拥有和父类一样的变量、方法等,然后在父类的基础上再添加新的变量方法或者重写父类已有的方法。这一点比较重要。
然后下面有一个Description,这里是对当前这个类的简单描述和注意事项。
接下来看第二个部分:
Variables是变量的意思,说明了在GameObject这个类里面,拥有这么多个属于它自己的变量(父类的不算,下面有说明)。假如我们已经有一个GameObject的对象叫做obj1,那么我们就可以在这个对象身上使用它的变量,比如
obj1.layer = 10之类。
我们可以点进去看看,里面就有对这个类的变量的一些说明,甚至是代码的使用举例。
第三个部分是构造函数:
我们使用一个脚本的时候,可以有2种方式,一种是直接调用类身上的静态方法,一种是把一个类实例化一个对象出来,然后操作这个对象。像刚才所举的例子,你有一个GameObject的对象叫obj1,那么这个obj1是怎么来的呢?一般来说就是你构造出来的,比如这样写:GameObject obj1 = new GameObject(“obj1”);这样我们就创建出了一个GameObject类的对象,并可以操作这个obj1个体进行一些改变位置或者是缩放之类的操作。
第四个部分是公共方法:
刚才我们已经看过变量是怎样用的,这里的公共方法也是一样,我们需要先构造一个GameObject类的对象,比如叫obj1,
然后我们就可以对obj1调用方法了,举个例子,obj1.SetActive(false);就把obj1给隐藏掉了。
就拿SetActive作为例子点进去看看,同样可以看到对于这个方法的说明。
public void SetActive(bool value)是一个方法的调用说明。
void是调用后没有返回值,bool value是传入这个方法的参数说明,这个方法里面,必须传入一个布尔值的参数,假如传入其他类型的参数,将会报错。
下面的Parameters就是参数的意思,将会逐个参数告诉我们这个参数是用来干什么用的。
再举另外一个方法:
这个方法的调用说明是public Component GetComponent(Type tyoe),
这次public后面跟的就不是void ,而是Component。这是代表了这个方法将会有返回值,返回值的类型就是Component
顺便可以看看更复杂更多参数的一些其他方法:
像这个Mathf.Lerp方法,调用函数是
public static float Lerp(float a,float b,float t)
这次public后面还多了一个static,这代表这个方法是静态方法,不需要构造对象就可以直接调用。比如这里你就不需要创建一个Mathf的对象,直接写代码float result = Mathf.Lerp(2,3,0.6f);就可以得到结果,返回的值是一个float浮点类型。
再看这个Collider.RayCast方法,这次的第二个参数out RaycasHit hitInfo 很特别,具体的用法可以自己百度一下ref参数和out参数。大概的意思是你需要传入一个已经存在的变量hitInfo,然后在执行完这个方法之后,这个hitInfo变量虽然不会作为方法的返回值,但这个参数在方法里面会给他赋值,在方法结束后外面的变量hitInfo就有相应的改变。
刚才在介绍public function时顺便介绍了一些最基本的程序知识,接下来继续看api的下一个部分:
这里就是这个类的静态方法。刚才顺便说过静态方法的意思了,所以这里举例:
比如GameObject.Find方法,你不需要(其实是不能)构造一个GameObject的对象然后调用,
比如你想查找场景里面一个叫做"abc"的物体,如果你是这么写,是错误的:
GameObject obj = new GameObject();
GameObject objABC = obj.Find(“abc”);
这样写是错误的。
正确的写法是:
GameObject objABC = GameObject.Find(“abc”)
最后一部分就是继承的成员内容,包括了继承的变量 、公共方法和静态方法。由于GameObject类是继承Object类的,所以这些变量和方法,其实就是Object本身的变量和方法了,可以搜索一下Object类然后打开对比看一下
ok,到这里Unity的API文档查看方法已经大概说了一遍了,说这么多的目的有2个:
第一,当我们不知道一个方法怎样用的时候,可以来这里搜索。比如你想做一个功能,但不知道在Unity里面怎样写,可以猜一下你想做的功能的大概意思,在搜索里面输入相关的单词,然后看看有没有你想要的对应的API可以实现。
第二,当你写代码发现总是出错的时候,你可以怀疑自己的用法错了,然后到这里查询一下,是不是传入的参数类型错误了,或者调用的方法是静态方法不能用在对象身上之类。
希望对初学者有一定的帮助。