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 ...
随机推荐
- 处理流中的异常-JDK7-和JDK9流中异常的处理
处理流中的异常 JDK7和JDK9流中异常的处理 jdK7的新特性在try的后边可以增加一个(),在括号中可以定义流对象那么这个流对象的作用域就在try中有效try中的代码执行完毕,会自动把流对象释放 ...
- Java 进阶P-1.1+P-1.2
用类制造对象 对象与类 对象是实体,需要被创建,可以为我们做事情 类是规范,根据类的定义来创建对象 对象=属性+服务 数据:属性或状态 操作:函数 从这些例子可以看出来 class是提供服务的,数据是 ...
- mybatis-plus 多租户
package com.ruoyi.framework.config; import org.springframework.context.annotation.Bean; import org.s ...
- 深入解读.NET MAUI音乐播放器项目(一):概述与架构
系列文章将分步解读音乐播放器核心业务及代码: 深入解读.NET MAUI音乐播放器项目(一):概述与架构 深入解读.NET MAUI音乐播放器项目(二):播放内核 深入解读.NET MAUI音乐播放器 ...
- mybatis学习日记2
1.mybatis中的连接池 配置的位置: 主配置文件SqlMapConfig.xml中的dataSource标签,type属性就是用来表示采用何种连接方式 mybatis连接池提供了3种方式的配置 ...
- ROS创建一个基本功能包
1.mkdir catkin_ws/src 2.cd catkin_ws/src 3.catkin_init_workspace 4.cd ~/catkin_ws/ 5.catkin_make 6.在 ...
- 编写FailServlet和SuccessServlet类
@WebServlet("/successServlet") public class SuccessServlet extends HttpServlet { protected ...
- 对Jim博士质疑的质疑
我只是中科大一个本科生,不像Jim博士那样顶了博士的帽子.去年他上头条的时候评论了他的一篇文章. 看了他的一些文章,感觉他对国内科研现状以及和美西方的差距非常了解,并且做了大量的调研,站在国家的立 ...
- 数字列表number,目标值target,找到number中两个不同数字之和等于target的数字,输出下标并顺序排列 ----笔试题记录扩展
一.思路: 输入:数字列表number,目标值target 判断条件:数字列表中两个不同数字相加等于target 输出:符合条件的两个数字的下标,下标顺序排列 方法1: def list(number ...
- 中南大学CSU2022-2023级C语言期中考试机试答案
卡在出线概率了.40%,没想到遍历时反了,我去. 1.时钟加法 1 #include<stdio.h> 2 3 #include<string.h> 4 5 #include& ...