Unity3D第一次亲密接触

发布于 2012-08-21  213 次阅读


刚开始接触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类型变量赋值的测试代码:

 1 
public 
class InspecterTest : MonoBehaviour {

 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     }
17 }  

 音频方面 通过AudioSource Component添加的音频不仅有3D空间感 连快速移动时候的多普勒效应都已经加入了,可以直接在EDITOR里设定声音的传播范围和衰减函数曲线,非常强大。

还有很多没有探索到的地方,以后继续完善吧。 




点击数:89


一沙一世界,一花一天堂。君掌盛无边,刹那成永恒。