Unity3D Editor模式下批量修改prefab

最经遇到一个需要批量修改已经做好的prefab的问题,查了一些资料最终实现了但是还是不够完美,通过学习也发现unity的编辑器功能还是非常强大的。废话不多说直接上代码:

 1 [ExecuteInEditMode]
 2     [MenuItem("Tools/RecordPoint Add Flame")]
 3     private static void RecordPointAddFlame()
 4     {
 5         GameObject twoSphere = AssetDatabase.LoadAssetAtPath("Assets/Resources/Prefabs/TwoSphere.prefab", typeof(GameObject)) as GameObject;
 6
 7         string[] ids = AssetDatabase.FindAssets("t:Prefab", new string[] { "Assets/Resources/Prefabs" });
 8         for (int i = 0; i < ids.Length; i++)
 9         {
10             string path = AssetDatabase.GUIDToAssetPath(ids[i]);
11             Debug.Log(path);
12             if (!path.Contains("TwoCube"))
13             {
14                 continue;
15             }
16             GameObject originTwoCube = AssetDatabase.LoadAssetAtPath(path, typeof(GameObject)) as GameObject;
17             GameObject twoCube = PrefabUtility.InstantiatePrefab(originTwoCube) as GameObject;
18
19             foreach (Transform item in twoCube.transform)
20             {
21                 if (item.FindChild("TwoSphere") == null)
22                 {
23                     GameObject ts = PrefabUtility.InstantiatePrefab(twoSphere) as GameObject;
24                     ts.transform.parent = item;
25                 }
26             }
27
28             var newprefab = PrefabUtility.CreateEmptyPrefab("Assets/Resources/Prefabs/TwoCube.prefab");
29             PrefabUtility.ReplacePrefab(twoCube, newprefab, ReplacePrefabOptions.Default);
30         }
31
32         AssetDatabase.SaveAssets();
33         Debug.Log("Done");
34     }

这段代码的功能是在TwoCube这个prefab的两个子对象cube上挂一个名为TwoSphere的prefab。如图

最终结果如下:

代码中为什么要使用PrefabUtility.InstantiatePrefab和PrefabUtility.ReplacePrefab,这是因为上述例子有一点比较特殊的地方,就是是一个prefab中嵌入另一个prefab。如果单纯的只是操作一个prefab是没有必要这样做的。

时间: 2024-10-13 11:17:58

Unity3D Editor模式下批量修改prefab的相关文章

vi文本模式下批量修改指定字符串

在Vi里面实现字符串的批量替换. a. 文件内全部替换: %s#abc#def#g(用def替换文件中所有的abc) 例如把一个文本文件里面的"linuxidc.com"全部替换成"linuxidc.net": :%s#linuxidc.com#xwen.net#g (如文件内有#,可用/替换,比如:%s/linuxidc.com/xwen.net/g) b. 文件内局部替换: 把10行到50行内的"abc"全部替换成"def"

windows下 批量修改文件名

Windows系统下批量修改文件名的详细步骤 听语音 | 浏览:11135 | 更新:2017-08-06 01:36 | 标签:windows 1 2 3 4 5 6 7 分步阅读 Windows系统下批量修改文件名的详细步骤 工具/原料 Dos命令操作 简单批量修改文件名 1 在Windows系统上批量修改文件名是非常简单的.选择所有的文件,按F2,然后输入一下描述性的文本,按enter键之后,所选的文件会以输入的描述性文字加数字排列. END 多步修改文件名 在任意一个盘中新建一个文件夹,

关于linux系统下批量修改文件名和后缀

总会遇到遇到处理文件的问题,比如文件后缀修改,以前都是写shell,后来发现有个更简单的方法 rename 1,在centos 下是用c 写的 rename 用法: a.txt  修改为 a.cc rename txt  cc *.txt                  renme  [原字符串]  [要修改成的字符串]   [匹配文件] 有时候会遇到按序号段来修改的 a001.txt  修改为a0099.txt rename a00 a000 a00??        rename  [原字

OSG立体模式下动态修改相机远近裁剪面的实现

1. 非立体模式下动态修改相机远近裁剪面 class GLB_DLLCLASS_EXPORT CGlbGlobeClipHandler : public osg::NodeCallback    { struct CustomProjClamper : public osg::CullSettings::ClampProjectionMatrixCallback  { template<class matrix_type, class value_type>            bool _

linux--目录下批量修改IP

sed -i 's/10.11/10.22/g' `grep ir 10.11 *| grep -E'.xml:|.cfg:|.ini:|.wsdl|.properties:' |awk -F:'{print $1}' |uniq` 其中10.11是原IP,10.22是新IP. '.xml:|.cfg:|.ini:|.wsdl|.properties:'  为要修改的配置文件: linux--目录下批量修改IP

在Editor模式下编辑贝塞尔曲线

贝塞尔曲线的原理以及具体实现方式在网上随处可见,这里不再赘述.实际上,在Unity的Editor模式下,系统已经提供了现成的接口,只需要简单的几行代码,便能实现可自由拖曳的贝塞尔曲线. 首先,创建一个Bezier.cs文件,具体代码如下: //将代码添加至任意GameObject即可 using UnityEngine; using System.Collections; public class Bezier : MonoBehaviour { //起始于startPosition,走向于st

Linux下批量修改文件及文件夹所有者及权限

Linux下批量修改文件及文件夹所有者及权限需要使用到两个命令,chmod以及chown 例:对/opt/Oracle/目录下的所有文件与子目录执行相同的权限变更: chmod -R 700 /opt/oracle/ -R参数是递归 处理目录下的所有文件以及子文件夹 700是变更后的权限表示(只有所有者有读和写以及执行的权限) /opt/oracle/ 是需要执行的目录 例:对 /opt/oracle/  目录下的所有文件与子目录执行相同的所有者变更,使所有者修改为oinstall用户组的ora

Linux下批量修改文件名(rename)

原文地址: http://blog.csdn.net/sea_shore/article/details/6102437 1.rename命令批量修改文件名, 其实linux下可以使用别的办法来批量修改文件名, 不过rename实在太方便了 比如把所有的表为cdb1_* 修改为cdb_*的在本目录下只需要# rename 'cdb1' 'cdb' * 以前都是写个for循环来做...想想多傻啊, 呵呵 rename还有更多的功能, 建议man rename下 From:http://www.ha

Linux下批量修改文件名(rename)

1.rename命令批量修改文件名, 其实Linux下可以使用别的办法来批量修改文件名, 不过rename实在太方便了 比如把所有的表为cdb1_* 修改为cdb_*的在本目录下只需要# rename 'cdb1'  'cdb'  * 以前都是写个for循环来做...想想多傻啊, 呵呵 rename还有更多的功能, 建议man rename下 From:http://www.hao32.com/unix-linux/42.html 2.批量更改文件名 rename 通过 man rename 命