使用Prefab的笔记

基础:基于NGUI制作组件的Prefab

Unity的Prefab

在一个游戏中,会存在一些通用的组件,比如:按钮,消息框,内容框背景,文字输入框等等,这些东西在制作前期就需要统一规化好,利于后期的维护。

虽说它们是通用的,但是它们之间还是存在差异的:差异:Label上文字不一样,按钮的Name不一样,按钮的WidthxHeight不一样,Depth不一样,position不一样;但它们也有相同点:按钮的SpriteName是一样,Label描边一样,Label字号一样

我们的做法:

通常我们都会把这些通用的组件做成Prefab,然后在每一个UI页面中都使用同一个Prefab。这样做没有问题的,但如果美术改版,就要不小心这些Prefab了。如果你修改完某一个UI页面的通用Prefab之后,千万别点Applay,否则会出现所有UI的通用组件都是相同的(transform上的属性不相同)。

这是为什么呢?

因为所有UI的按钮都是链接到同一个Prefab,而到后期美术改版,某个地方改了Prefab,而按了Applay,所有UI的按钮都会发生改变。

解决办法:

我们现在的解决办法是给个Prefab都添加一个XXXAssist的组件,用来固定它的不一样的属性,比如width,height,depth等,然后修改的时候,只修改Prefab的相同属性

1、绑定的组件简单代码如下:只有基础的功能,可按需添加

using UnityEngine;
using System.Collections;

/// <summary>
/// 绑定在通用的背景Prefab上
/// </summary>
[ExecuteInEditMode]//在编辑器模式下可执行
public class CCommBgHelper : MonoBehaviour
{
    public GameObject BindObject;

    public int Width = 200;
    public int Height = 200;

//只在美术工程执行
#if GAME_ART
    // Update is called once per frame
    public virtual void Update()
    {
        if (BindObject != null)
        {
            var tex = BindObject.GetComponent<UIWidget>();
            tex.width = Width;
            tex.height = Height;
            //CDebug.Log("update size");
        }
    }
#endif
}

 

2、写了一个Editor的小工具,把所有场景的通用Prefab都绑定一下

注:首先我们所有的UI的结构都是如下,并且所有的UI都放在统一的目录下

 

[MenuItem("Game/UI/通用背景整理")]
public static void BindCommBgPrefab()
    {
        bool changed = false;
        //遍历所有的UI
        foreach (var uiScene in Directory.GetFiles("Assets/" + CCosmosEngineDef.ResourcesBuildDir + "/UI/", "*.unity"))
        {
            EditorApplication.OpenScene(uiScene);//打开它
            var theMainWindow = GameObject.Find("Window");

            if (theMainWindow)
            {
                var commAtlas = (UIAtlas) AssetDatabase.LoadAssetAtPath("Assets/UI/Atlas/CommonAtlas.prefab", typeof (UIAtlas));
                //遍历所有的Sprite,包括隐藏的
                foreach (var sprite in theMainWindow.GetComponentsInChildren<UISprite>(true))
                {
                    //同一图集,并且名字相同
                    if (sprite.spriteName == "xxx" && sprite.atlas == commAtlas)
                    {
                        CDebug.Log("Scene:{0} \n CommBgSprite: {1}", EditorApplication.currentScene, sprite.name);
                        //XXXX执行绑定功能
                        changed = true;
                    }
                }
            }
        }
        if (changed)
            EditorApplication.SaveScene();
    }

代码的意思就是:遍历所有的UI页面,找到Prefab,并添加绑定

 

当添加绑定组件时,在资源打包后, 在客户端运行是没有影响的,因为组件中的预编译命令#if GAME_ART 只在美术库工程执行。

当共用的部分,比如按钮图片发生改变时,只需要更改Project视图的Button.Prfab的图片,所有的Button的图也发生修改。而其它未改动的部分则保持不变。

资源规范加上写一些Editor小工具,可以很方便的实现批量修改,提高工作效率。

时间: 2024-10-15 23:14:54

使用Prefab的笔记的相关文章

CardboardCamera Prefab 中文笔记

在Cardboard的预制体(Prefab)中, CardboardCamera是最简单的一个,仅有两个子物体,一个PostRender, 一个PreRender,以及分别带的Camera组件. CardboardPreRender Script 在Camera的渲染绘制之前执行,主要任务是清空屏幕,因为VR模式下,VR的camera并不会充满整个屏幕. CardboardPostRender Script 作用比PreRender更大,在Unity渲染管线最后步骤中的最后,用以实现VR下两个摄

Unity学习笔记之五为Prefab添加材质

本次笔记中,我们将利用unity来创建并使用材质,把材质添加到我们的Prefab中去. 这一系列教程以及素材均参考自人人素材翻译组出品的翻译教程<Unity游戏引擎的基础入门视频教程>,下载链接附在第二篇学习笔记中. 继续上次笔记中所记录的东西,在Project视图中,ImportedAssets-Meshes-Materials下我们可以看到一个没有纹理的材质球,这个材质是跟随我们的3d Max模型来的默认材质.因为这里我们要添加自己的材质,所以我们直接把这个材质球删除. 删除后,我们看到本

Unity学习笔记之四完善Prefab并添加First Person Controller

好久没学东西并用博客记录了,这个年过的很懒散,慢慢临近开学了,也要提前适应一下,写写东西,这样开学才能更好的进入状态呀-- 本次笔记中,我们将来雕琢一个更加完善的Prefab,并添加一个第一人称角色在场景中. 这一系列教程以及素材均参考自人人素材翻译组出品的翻译教程<Unity游戏引擎的基础入门视频教程>.下载地址附在第二篇笔记中. 上一篇教程我们创建了一个Prefab,在最后我利用四个Prefab通多顶点捕捉建立一个简易的隧道.这只是为了示意Prefab的便捷性,下面我们先把这个隧道删除到只

Unity3D学习笔记之六创建更多的Prefab

在写完上次的笔记后,我发现当前的Prefab只为地板添加了盒子碰撞器而忽略了墙壁和天花板,所以我们这次 首先为其他部分添加碰撞器.因为我们要以此Prefab为模板创建新的Prefab. 这一系列教程以及素材均参考自人人素材翻译组出品的翻译教程<Unity游戏引擎的基础入门视频教程>,下载链接附在第二篇学习笔记中. 首先选中一边墙壁,Component-Physics-Box Collider,然后根据当前坐标轴的方位和模型比例调节BoxCollider的厚度,例如这里我将X设为0.01,其他保

Unity学习笔记:预制件Prefab的创建和使用

在制作游戏过程中,会需要通过代码创建多个一模一样的GameObject,比如射击游戏中的子弹,杂兵等各种. 在Unity中一般叫做Prefab预制件,起到模板的作用,可以快速的复制出相同的GameObject. 创建Prefab预制件 一般都会建立独立的目录,用于存放预制件. 第一种方法 在场景中添加一个GameObject,完成相关的设置.然后将其拖拽到Assets/Prefabs中 第二种方法 在Assets/Prefabs中,新建空的预制件 然后将场景中的GameObject拖到这个上面

有关Unity 的一些 笔记之prefab

unity动态创建对象,需要使用预设prefab,以下方法可以动态创建. 首先需要在Hierarchy视图里创建GameObject,然后创建Prefab. 方法一: public   GameObject instantiate; GameObject go=Instantiate(instantiate,transform.position,transform.rotation) as GameObject; 将做好的prefab拖到Inspector界面中的 instantiate 字段中

Unity3D学习笔记之三Prefab组件的使用

本次教程,我们来创建一个简单的Prefab组件. 教程参考自人人素材翻译组出品的翻译教程<Unity游戏引擎的基础入门视频教程>. 说到Prefab,中文翻译为预设体,在Unity官方的书本<Unity4.X从入门到精通>中的解释是:可以理解为是一个游戏对象及其组件的集合,目的是使游戏对象及资源能够被重复使用.相同的对象可以通过一个预设体来创建,此过程可理解为实例化. 存储在项目文件中(Project视图)的状态时,预设体作为一个资源,可应用在一个项目中的不同场景中.当拖动预设体到

Unity学习笔记13——代码动态加载Prefab预设体

在进行一些功能开发的时候,我们常常将一些能够复用的对象制作成.prefab的预设物体,然后将预设体存放到Resources目录之下,使用时再动态加载到场景中并进行实例化.例如:子弹.特效甚至音频等,都能制作成预设体. 一.预设动态加载到场景: 一个预设体要能够通过代码控制在场景中进行显示,需要三个步骤,这里我们以动态加载怪物血条为例子分析一个常见的误区: 1.预设体资源加载: //加载预设体资源 GameObject hp_bar = (GameObject)Resources.Load("Pr

Unity3D学习笔记之七创建自己的游戏场景

到现在为止我们已经拥有了比较完备的Prefab,已经可以创建宏大的游戏场景,并以第一人称视角在场景中漫游了.这里给大家做个小的示范,建一个小场景大家在创建场景的时候需要自由发挥,做个尽量大的场景出来. 这一系列教程以及素材均参考自人人素材翻译组出品的翻译教程<Unity游戏引擎的基础入门视频教程>,下载链接附在第二篇学习笔记中. 我们以最初的添加了First Person Controller的PFB_Straight为整个场景的中心点来展开.我们先从Project中Prefabs文件夹拖出来