大家好,从这篇开始,Unity3D新的系列博客开始了:《Unity3D项目实战笔记》。
主要就项目中用到的技术和难点整理为博客笔记。欢迎大家拍砖。
对于软件项目,解耦合的插件架构设计很重要:
一是方便多人协同工作,以提高沟通能力,减少单兵种作战的孤独。
二是为了里程碑的产出,以使得软件有节奏的进行构建。
三是为了维护方便。
同理,Unity3D项目也有自己内置的“插件”来进行解耦合设计。它就是prefab东东—我在开始自学Unity3D的时候,并未对prefab深以为然,仅仅看到NGUI大量提供了prefab的图集和控件;而在实战项目中,我们也用到大量的prefab。
此处省去制作prefab的若干字,有兴趣的读者,可看看2年前雨松的博客:《研究院之预设的使用细节(五十一)。
prefab动态加载
在编辑器中,拖入prefab即可加载到场景中。而在实际使用的时候,动态加载是更常用的功能–需要把把prefab放到Resources文件夹下(多深的文件夹都可以的)
prefab = (GameObject)UnityEngine.Object.Instantiate(Resources.Load("ball"));
这样的话,在开发阶段,可个人负责一个prefab的UI界面、代码逻辑,然后再按照目录存放好prefab。还是动态加载的方式,还是挺方便的。
prefab动态定位
实现了动态加载prefab后,有一个刚需问题就是动态的定位了。例如
a.prefab被加载到了A的子节点下面,要使得a显示b点位置,一个办法是把a挂接到B下; 另外一个办法是用transform提供的2个方法,转换局部坐标为世界坐标,实现动态定位。
//
// Summary:
// Transforms position from local space to world space.
public Vector3 TransformPoint(Vector3 position);
//
// Summary:
// Transforms position from world space to local space. The opposite of Transform.TransformPoint.
public Vector3 InverseTransformPoint(Vector3 position);
如:
Vector3 pos = A.transform.TransformPoint(a.localPostion);
b.localpostion = B.transform.InverseTransformPoint(pos);
动态定位非常容易的。
prefab注意事项
!!! prefab要注意勤保存文件,如制作一个prefab花了30分钟,那么正常关闭unity3d,不妨喝水休息一下,我最近连续2周,已经丢了超过3个prefab—-Unity3D的一个bug,当不正常关闭Unity3D后,就会导致正在编辑的prefab不可用(unity3D在调试过程中,偶尔会死机,导致通过进程杀掉它)