刚开始接触Unity3D引擎,作为一个在MAC上非常出名的商业3D游戏引擎,从开发工具到执行效率都非常的专业简便。标准素材库里的脚本和资源足以不写代码完成一个FPS式的场景。
首先是资源的导入功能,3DS MAX MAYA之类常用的3D建模工具都可以支持,导入的3D模型会以fbx文件格式存在于项目资源目录中。支持多层纹理材质(可能需要自己写shader),骨骼动画,变形动画等。但是导入之后的材质需要在editor里重新赋予纹理,目前还没有找到好的解决办法(UV坐标是正确导入的)
代码方面 可以使用boo,js,C#脚本。C#脚本编辑器可以使用vs或者自带的MONO DEVELOP。在使用MONO DEVELOP的时候需要注意代码文件必须保存为unicode的编码,否则会出现很多莫名其妙的编译错误还会让中文变成乱码。
所有的行为脚本派生自Behavior类型,行为脚本可以作为Componet赋予场景中的GameObject。c#脚本的对象系统不再是.net里的Object,而是以Unity3d的Object类为基本类型。场景中的物体都派生自GameObject,GameObject派生自Object,Component派生自Object,一个GameObject可以含有多种Componet类型的成员,可以使用GameObject.getComponent方法获取在EDITOR里赋予此物体的Component.所有GameObject都有个Transform Component,可以由此操作对象在场景中的位置和几何变换。行为脚本的基类Behavior也是Component子类,也就是说行为脚本也是以Component的形式和GameObject发生关联。在C#里可以使用public来定义属性,从而可以在Editor的inspector视图中直接给这些属性赋值。既支持基本的C#数值,字串,还支持u3d引擎提供的类型,比如SoundClip类型的public变可以在inspecter里指定为Project View中的音频素材。这里有一个值得注意的地方,对于Component类型的public变量,在inspector中指定一个GameObject时,实际赋予的并不是这个GameObject,而是这个GameObject对应类型的Componet。比如把一个Cube对象赋予给一个Behavior的Transform类型public变量x,结果在C#脚本里是把这个Cube的transform属性赋给了x,不是Component本身。想必这也是出于编辑场景时候的方便,节约一些绕来绕去的GameObject.getComponent调用。对于不想在inspector中出现的变量,可以在C#里设定为private或者protect访问级别。这是比js方便的地方。
这里附上一段测试上面说的对派生自Component类型变量赋值的测试代码:
2 public Transform target;
3 public AudioClip sound;
4 protected int ptest;
5 // Use this for initialization
6 void Start () {
7 print ("目标是:"+target.name);
8 print ("目标位置:"+target.transform.position);
9 print ("目标类型:"+target.GetType());
10 print ("目标是不是GameObject?:"+(target is GameObject).ToString());
11 }
12
13 // Update is called once per frame
14 void Update () {
15
16 }
音频方面 通过AudioSource Component添加的音频不仅有3D空间感 连快速移动时候的多普勒效应都已经加入了,可以直接在EDITOR里设定声音的传播范围和衰减函数曲线,非常强大。
还有很多没有探索到的地方,以后继续完善吧。