Unity3D项目实战笔记(1):prefab的插件方式

大家好,从这篇开始,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后,有一个刚需问题就是动态的定位了。例如

image

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在调试过程中,偶尔会死机,导致通过进程杀掉它)

作者: 王文刚

学习心得、技术分享