1.适用于制作多个预制体(一个模型文件下面几百个子物体,都需要制作成预制体,这一个一个拖不是要炸裂)

模型资源如下图

2.模型先放到Resources文件夹下面方便读取,制作完预制体可以给他拖到其他文件夹

模型文件结构如下图(经测试放模型的文件夹名字要和模型名字一致,不然找不到,你也可以修改代码测试其他方法)

3.下面是编辑器脚本

using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Text.RegularExpressions;
using UnityEditor;
using UnityEngine;
/// <summary>
/// 编辑器脚本
/// </summary> public class CreationPrefab : EditorWindow
{
[MenuItem("Tools/一键生成Prefab")]
public static void CreatePrefabWindow()
{
EditorWindow window = EditorWindow.GetWindowWithRect(typeof(CreationPrefab), new Rect(Screen.width / 3, Screen.height / 3, 800, 500), true, "CreationPrefab");
window.Show();
}
//保存prefab的路径
private static string toSavePrefabPath = "Assets/Prefabs/新模型库/机柜内设备"; private void OnGUI()
{ EditorGUILayout.LabelField("预制体保存路径::", toSavePrefabPath, GUILayout.Width(110));
toSavePrefabPath = EditorGUILayout.TextArea(toSavePrefabPath, GUILayout.Width(250)); if (GUILayout.Button("转换预制体", GUILayout.Width(260)))
{
ToPrefab();
} if (GUILayout.Button("修改预制体", GUILayout.Width(260)))
{
ModifyPrefab(toSavePrefabPath);
} }
private void ToPrefab()
{
string path = "Assets/Resources";
string[] allFolder1 = GetAllFolder(path);
if (allFolder1 == null)
return;
//循环次数取决于 ,源文件的目录结构 ,此处为 4 级结构
//也就是Resources下面4级文件夹,到达模型文件夹 一级一个for循环
for (int i = 0; i < allFolder1.Length; i++)
{
string path2 = $"{path}/{allFolder1[i]}";
string[] allFolder2 = GetAllFolder(path2);
if (allFolder2 == null)
{
return;
}
for (int j = 0; j < allFolder2.Length; j++)
{
string path3 = $"{path2}/{allFolder2[j]}";
string[] allFolder3 = GetAllFolder(path3);
if (allFolder3 == null)
return;
for (int k = 0; k < allFolder3.Length; k++)
{ string path4 = $"{path3}/{allFolder3[k]}";
string[] allFolder4 = GetAllFolder(path4);
Debug.Log($"编号:{k} {allFolder3[k]}文件下有 {allFolder4.Length} 个文件夹!");
if (allFolder4 == null)
return; if (!Directory.Exists(toSavePrefabPath))
{
Directory.CreateDirectory(toSavePrefabPath);
} for (int l = 0; l < allFolder4.Length; l++)
{
string speedTree = $"{path4}/{allFolder4[l]}/{allFolder4[l]}";
string[] strs = Regex.Split(speedTree, path + "/", RegexOptions.IgnoreCase);
GameObject go = Instantiate(GetFileObj(strs[1]));
go.name = go.name.Replace("(Clone)", string.Empty);
//给预制体添加脚本,修改属性
//go.transform.tag = "Model";
//if (go.GetComponent<BoxCollider>() == null)
// go.AddComponent<BoxCollider>(); //if (go.GetComponent<Rigidbody>() == null)
// go.AddComponent<Rigidbody>(); //go.GetComponent<Rigidbody>().isKinematic = true; string modeName = allFolder4[l].Split('_')[0]; for (int p = 0; p < go.transform.childCount; p++)
{
PrefabUtility.SaveAsPrefabAsset(go.transform.GetChild(p).gameObject, $"{toSavePrefabPath}/{go.transform.GetChild(p).name}.prefab"); } DestroyImmediate(go); }
AssetDatabase.Refresh();
}
} } } /// <summary>
/// 获取路径下的 Obj
/// </summary>
/// <param name="path"></param>
/// <returns></returns>
private GameObject GetFileObj(string path)
{
GameObject go = Resources.Load<GameObject>(path);
if (go != null)
{
return go;
}
else
{
Debug.Log(path);
return null;
} }
/// <summary>
/// 获取路径下的所有文件夹
/// </summary>
/// <param name="path"></param>
/// <returns></returns>
private string[] GetAllFolder(string path)
{
try
{ string[] dirs = Directory.GetDirectories(path, "*");
string[] folderName = new string[dirs.Length];
for (int i = 0; i < dirs.Length; i++)
{
string file = dirs[i].Split('\\')[1];
folderName[i] = file;
}
return folderName;
}
catch (System.Exception)
{ return null;
} } /// <summary>
/// 修改预制体
/// </summary>
/// <param name="path"></param>
private void ModifyPrefab(string path)
{ //获取文件下所有预制体文件
DirectoryInfo info = new DirectoryInfo(path);
FileInfo[] fileInfos = info.GetFiles("*.prefab");
List<GameObject> prefabs = new List<GameObject>();
foreach (var item in fileInfos)
{
string paths = $"{path}/{item.Name}";
GameObject prefab = AssetDatabase.LoadAssetAtPath(paths, typeof(GameObject)) as GameObject;
prefabs.Add(prefab);
}
Debug.Log("执行么" + prefabs.Count);
//修改属性
for (int i = 0; i < prefabs.Count; i++)
{
//修改预制体的position和旋转角度
if (prefabs[i].GetComponent<Transform>() != null)
{
prefabs[i].GetComponent<Transform>().position = Vector3.zero;
prefabs[i].GetComponent<Transform>().rotation = Quaternion.Euler(Vector3.zero);
}
//其他属性请自行添加即可
//if (prefabs[i].GetComponent<Rigidbody>() != null)
//{
// prefabs[i].GetComponent<Rigidbody>().isKinematic = false;
// PrefabUtility.SavePrefabAsset(prefabs[i]);
//} }
AssetDatabase.SaveAssets();
AssetDatabase.Refresh();
}
}

两个功能一个生成预制体,一个修改预制体的坐标和角度为0

功能显示位置如下图

编辑器脚本需放到Editor文件夹下面

Unity一键制作预制体Prefab一键修改Prefab属性的更多相关文章

  1. [转]Unity批量制作预制物体Prefab

    http://www.u3dblog.com/?p=441 有时候场景中一大批物体都需要制作成预制物体,但是unity只能手动一个一个的创建,感觉非常的蹩脚,下面一个编辑器类的方法解决你的麻烦. st ...

  2. 预制体,Mask组件

    1.预制体制作和使用 a.制作预制体,将制作好的元素插入到在文件夹下形成一个预制体 b.将预制体在所调用的脚本文件中进行声明,并且在界面里进行拖入保存 c.使用的时候利用cc.instantiate进 ...

  3. 修改预制体效果无变化(unity&&CocosCreator)

    推荐阅读:  我的CSDN  我的博客园  QQ群:704621321 1.问题       修改预制体后保存,预览游戏预制体未发生变化(和改之前效果一样) 2.回忆       以前做unity的时 ...

  4. Nested Prefab Mode 嵌套预制体 保存问题 Dirty

    Unity2018.3 Nested Prefab Mode 嵌套预制体 Unity2018.3开始,新增了一个Prefab Mode,俗称嵌套预制体,在Prefab里套Prefab.实际应用中多少会 ...

  5. 关于Unity中stretch的分开使用、预制体、Scroll View的UI节点

    一.上次讲的菊花的四个花瓣,只讲了四个花瓣和在一起的时候的作用,现在是分开的菊花的四个花瓣的作用 1.创建一个Canvas2.对Canvas进行初始化3.创建一个Image的UI节点作为Canvas的 ...

  6. 大白菜装机版一键制作启动u盘教程

    第一步 下载并且安装好大白菜装机版,打开安装好的大白菜装机版,插入u盘等待软件成功读取到u盘之后,点击“一键制作启动u盘”进入下一步操作.如下图所示 第二步 在弹出的信息提示窗口中,点击“确定”进入下 ...

  7. “一键制作启动u盘失败”的主要原因是什么?

    一键制作启动u盘失败的主要原因是什么?今天u启动小编就和大家一起来分析原因并寻求答案吧!     原因分析:   1.u盘内有文件正在运行或者是打开:   2.u盘自身的质量问题:   3.最主要的原 ...

  8. S04_CH02_工程移植ubuntu并一键制作启动盘

    S04_CH02_工程移植ubuntu并一键制作启动盘 2.1概述 2.2搭建硬件系统 本章硬件工程还是使用<S04_CH01_搭建工程移植LINUX/测试EMMC/VGA>所搭建的VIV ...

  9. 一键制作镜像并发布到k8s

    *:first-child { margin-top: 0 !important; } .markdown-body>*:last-child { margin-bottom: 0 !impor ...

  10. Layabox 预制体prefab使用

    //腊鸭官方api不详细系列之ui预制体 // 创建预制体文件,随便拖一个场景中的预制体到 Assets的任意文件夹中,要规范的话则放在Prefab中 // 上一步操作完后就可以在文件夹中看到.pre ...

随机推荐

  1. 记OPNsense防火墙的安装过程 - 安全

    前些天在网上看到防火墙软件OPNsense,对其有了兴趣,以前写过一个其前面的一个软件M0n0wall( 关于m0n0wall的安装及配置 ),当时也是非常有名的防火墙,现在有了OPNsense,这个 ...

  2. C++ 地球人口承载力

    题目描述 假设地球上的新生资源按恒定速度增长.照此测算,地球上现有资源加上新生资源可供 xx 亿人生活 aa 年,或供 yy 亿人生活 bb 年. 为了能够实现可持续发展,避免资源枯竭,地球最多能够养 ...

  3. Nginx12 openresty使用lua-resty-http模块

    1 简介 https://github.com/ledgetech/lua-resty-http 在lua中操作http请求有两种方式 第一种方式:使用通过ngx.location.capture 去 ...

  4. redis06-事务

    1 基本说明 可以一次执行多个命令,本质是一组命令的集合.一个事务中的所有命令都会序列化,按顺序地串行化执行而不会被其他命令插入,不许加塞. 2 事务相关的几个命令 2.1 MULTI 标记一个事务块 ...

  5. C#IIS上传文件大小设置问题:maxRequestLength、maxAllowedContentLength

    system.web节点下的 maxRequestLength属性来指定最大上传文件的size,默认值是4M <system.web> <httpRuntime maxRequest ...

  6. 一个javaweb的项目的思路

    马上就要期中考试了,把最近靠自己学的知识总结一下(自己学的),以下为eclipse的一个界面 可以看出,有很多内容.首先,有好几个包,Bean,Dao,servlet,service,Util,Uti ...

  7. 使用云服务器配置MariaDB环境,Navicat远程连接一直出错误代码 "2002 - Can't connect to server on '' (10060)"

    使用腾讯云或者阿里云的服务器配置MariaDB数据库环境的时候,用Navicat远程连接在Centos7的Linux上配置MariaDB数据库环境的时候一直出错误代码 "2002 - Can ...

  8. JZOJ 2022.02.11【提高A组】模拟

    \(\text{Solution}\) 首先把 \(T2\) 给切了,\(T1\) 找半天规律找不到 然后打了个表算是暴力了 \(T3\) 也暴... 太暴了... \(T4\) 直接啥也不会 \(\ ...

  9. JZOJ 1040. 【GDOI2007】夏娜的菠萝包

    状压玩疯了 \(Code\) #include<cstdio> #include<iostream> #include<cstring> using namespa ...

  10. WPF Xaml标签的一些特殊符号 如何输入

    小于号 <   输入 <  注意有分号 大于号 >   输入  > 符号 &   输入 & 引号 "  输入 "