Unity一键制作预制体Prefab一键修改Prefab属性
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属性的更多相关文章
- [转]Unity批量制作预制物体Prefab
http://www.u3dblog.com/?p=441 有时候场景中一大批物体都需要制作成预制物体,但是unity只能手动一个一个的创建,感觉非常的蹩脚,下面一个编辑器类的方法解决你的麻烦. st ...
- 预制体,Mask组件
1.预制体制作和使用 a.制作预制体,将制作好的元素插入到在文件夹下形成一个预制体 b.将预制体在所调用的脚本文件中进行声明,并且在界面里进行拖入保存 c.使用的时候利用cc.instantiate进 ...
- 修改预制体效果无变化(unity&&CocosCreator)
推荐阅读: 我的CSDN 我的博客园 QQ群:704621321 1.问题 修改预制体后保存,预览游戏预制体未发生变化(和改之前效果一样) 2.回忆 以前做unity的时 ...
- Nested Prefab Mode 嵌套预制体 保存问题 Dirty
Unity2018.3 Nested Prefab Mode 嵌套预制体 Unity2018.3开始,新增了一个Prefab Mode,俗称嵌套预制体,在Prefab里套Prefab.实际应用中多少会 ...
- 关于Unity中stretch的分开使用、预制体、Scroll View的UI节点
一.上次讲的菊花的四个花瓣,只讲了四个花瓣和在一起的时候的作用,现在是分开的菊花的四个花瓣的作用 1.创建一个Canvas2.对Canvas进行初始化3.创建一个Image的UI节点作为Canvas的 ...
- 大白菜装机版一键制作启动u盘教程
第一步 下载并且安装好大白菜装机版,打开安装好的大白菜装机版,插入u盘等待软件成功读取到u盘之后,点击“一键制作启动u盘”进入下一步操作.如下图所示 第二步 在弹出的信息提示窗口中,点击“确定”进入下 ...
- “一键制作启动u盘失败”的主要原因是什么?
一键制作启动u盘失败的主要原因是什么?今天u启动小编就和大家一起来分析原因并寻求答案吧! 原因分析: 1.u盘内有文件正在运行或者是打开: 2.u盘自身的质量问题: 3.最主要的原 ...
- S04_CH02_工程移植ubuntu并一键制作启动盘
S04_CH02_工程移植ubuntu并一键制作启动盘 2.1概述 2.2搭建硬件系统 本章硬件工程还是使用<S04_CH01_搭建工程移植LINUX/测试EMMC/VGA>所搭建的VIV ...
- 一键制作镜像并发布到k8s
*:first-child { margin-top: 0 !important; } .markdown-body>*:last-child { margin-bottom: 0 !impor ...
- Layabox 预制体prefab使用
//腊鸭官方api不详细系列之ui预制体 // 创建预制体文件,随便拖一个场景中的预制体到 Assets的任意文件夹中,要规范的话则放在Prefab中 // 上一步操作完后就可以在文件夹中看到.pre ...
随机推荐
- java 进阶P-6.2+P-6.3
细胞自动机 CellularAutomation(细胞自动机)细胞自动机(英语:Cellular automaton),又称格状自动机.元胞自动机,是一种离散模型,在可算性理论.数学及理论生物学都有相 ...
- Java 进阶P-3.5+P-3.6
对象数组的for-each循环 for-each是用于遍历数组的另一种形式的for循环.for-each循环显着减少了代码,并且循环中没有使用索引或计数器. 句法: For(<数组/列表的数据类 ...
- 在Spring Boot中整合Katharsis,来快速开发JSON API的Web应用
1 简介 我们进行Web API开发的时候,经常会使用Json格式的消息体,而Json格式非常灵活,不同的人会有不同的设计风格和实现,而JSON API提供了一套标准.但它并不提供直接实现. Kath ...
- KingbaseES数据库备份初始化错误处理
KingbaseES使用sys_backup.sh脚本init初始化配置文件常见错误处理: sys_backup.sh脚本按照如下顺序寻找初始化配置文件: [kingbase@postgres ~]$ ...
- C-06\数组
一.一维数组 数组:表示同类数据的集合(业务功能一致且数据类型一样) []: 定义时,表示数组身份与标志,其中数值表示数组元素的总个数 定义以外使用时,表示下标运算,下标运算有两个操作符:指针 ...
- 四数相加II & 赎金信 & 三数之和 & 四数之和
一.四数相加Ⅱ 454. 四数相加 II 1.方法概述 首先定义一个map,key放a和b两数之和,value 放a和b两数之和出现的次数.遍历大A和大B数组,统计两个数组元素之和,和出现的次数,放到 ...
- JZOJ 5350. 【NOIP2017提高A组模拟9.7】陶陶摘苹果
题目 分析 很神奇的事情又发生了!! 很容易想到设 \(f_{i,j}\) 表示考虑前 \(i\) 个区间,已选 \(j\) 个区间且必选第 \(i\) 时能覆盖到的最多苹果数 转移 \(O(n)\) ...
- Fastjson Sec
Fastjson 前置知识 autoType功能 序列化:fastjson在通过JSON.toJSONString()将对象转换为字符串的时候,当使用SerializerFeature.WriteCl ...
- k8s(docker-desktop)简单搭建zookeeper三节点集群
前提 已经安装了docker-desktop,并且其中的kubernetes启动运行的.或者安装了k8s环境就行 可以正常下载dockerhub的镜像,这里采用了dockerhub官方制作的镜像 启动 ...
- net core api上传下载大文件 413、400错误 IIS服务器
1.背景 上传文件时,如果文件太大(一般指超过30M的文件)会报错,报错原因如下 IIS服务器:限制大文件上传,报413错误码 net core api项目:限制大文件上传,报400错误码 2.首先 ...