Unity 3D编程概览
之前玩过一段时间的Unity 3.5,最近发现可以pre-order unity 4了。看着这么帅的游戏引擎,不来玩玩实在是太可惜了。于是就重新拾起来了。
至于界面的操作,很简单,manual里也有很详细的介绍。我这篇文章说一下我初学的时候缺少的东西(花了好长时间才想明吧)。
Unity的世界里,显示出来的有很多模型。程序里也有一个对象模型。两个基本一致,但又有些不同。刚学的时候就是没有想明白这个。
有经验的朋友肯定知道整个场景叫scene。整个的场景,也就是游戏的全部世界(现在世界=scene)
scene里的东西都是GameObject,每个GameObject都有若干的Component(组建),其中一种Component:MonoBehavior,也就是我们平时说的脚本,构成了整个游戏的驱动核心。有意思的是GameObject也是继承Object的类,和Component在继承体系上平级。
在内部的程序员看来,与外部界面有点不同。因为是继承体系,最上面一层是Object,下一层是Component和GameObject,Component的再下一层是Transform、RigidBody、Collider、Behavior等各个具体的组建,当然组建下一层还可以继承出更精细功能的组建(比如CharacterController继承的Collider,MonoBehavior继承的Behavior)。
有人可能要问啦(仅限初学者),文档里只有一份通用的说明,继承体系也只有一套,而Unity支持Javascript、C#、Boo(python的.net改编)三种语言。对的,这三种语言共享一套继承体系。
javascript不同的是,你创建一个脚本,其实这个脚本本身就成为了一个MonoBehavior的对象,也就是说你脚本里面的所有代码(包括变量定义、函数声明等),都实际上是定义这个MonoBehavior的变量或成员函数。其访问方式也是一样(文件名+变量/函数名====对象名+变量/函数名)
其他两本语言需要自己完成继承体系。Script Referene里有完整介绍,就不多说了。
所以,Unity的编程最重要的是吃透这几个主要的类的变量和函数。(Object、Component、GameObject、Transform、RigidBody、Render、Joint(子类CharacterJoint、HingeJoint、SprinJoint )、ParticleEmitter、ParticleSystem、Collider(子类CharacterCollider)、Behavior(子类Animation、Light、Camera、ConstantForce、Audio、GUIElement、MonoBehavior)
Object是所有的类的核心,它有两个常用的方法:Instantiate和Destroy。一个是创建一个Object实例(不重复加载资源),一个是销毁一个Obejct(包括Component及以下任何Object)
Component是各个具体Component(例如RigidBody)联系的纽带。这里的设计有点意思,不像传统的继承体系,这个父类包含了对所有可能出现的子类的一个变量引用。(例如Transform对应的变量是transform)。也就是说在任何一个子类里,直接调用另外一种Component可以直接调用自己类内部的变量来完成(前提是本Component所在的GameObject也包含了另外需要调用的Component,如果没有的话则变量为null)。很神奇的设计,他文档里又不强调一下,让设计模式思维强的人过来一看就晕了。。。。
GameObject在类的继承体系里是直接继承的Object,与Component平级,但在游戏设计界面,貌似是一种包含关系。一个GameObject会包含很多Componnet。。。这点得注意。
再要注意一点,Transform是场景的核心。场景里的每个GameObject必然有一个Transform组件,而场景的所有GameObject在内部都是树形组织的,所以每个GameObject必然有父母或娃,在树上的节点类型就是Transform。也就是说是Transform组件把整个场景串起来的。(在索引场景物体时候会感觉出来)
剩下的重要类我概览一下(一定得仔细看类接口的)。RigidBody是物理引擎,就是给添加这个Component的GameObject施加物理作用。Render是控制显示,Joint是控制关节行为(例如人体关节,悬门等),Collider是脱离RigidBody的自己定义的碰撞,一个物体可以受物理引擎控制也可以受Collider控制碰撞。至于Behavior是所有能关掉的东西。如动画。灯光、摄像头、力、声音、脚本行为等。
也就这么些东西了。再深入学就是看别人的代码,然后写自己的了。当然,这会是一个漫长的过程。。。