Unity一键制作预制体Prefab一键修改Prefab属性

这篇具有很好参考价值的文章主要介绍了Unity一键制作预制体Prefab一键修改Prefab属性。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一.一键生成多个预制体的方法

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

1.2 模型资源如下图

unity怎么修改预制体参数,unity,游戏引擎,编辑器
unity怎么修改预制体参数,unity,游戏引擎,编辑器

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

模型文件结构如下图(经测试放模型的文件夹名字要和模型名字一致,不然找不到,你也可以修改代码测试其他方法)
unity怎么修改预制体参数,unity,游戏引擎,编辑器

1.4 下面是编辑器脚本

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();
    }
}

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

1.6功能显示位置如下图

unity怎么修改预制体参数,unity,游戏引擎,编辑器文章来源地址https://www.toymoban.com/news/detail-601450.html

二. 编辑器脚本必须放到Editor文件夹下面,否则会报错的

到了这里,关于Unity一键制作预制体Prefab一键修改Prefab属性的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 第十七章 Unity 预制件prefab(下)

    本章节我们来讲解如何编辑预制体文件。这里介绍三种打开编辑预制件的方式。第一就是通过预制件的实例游戏对象的Inspector检视面板上面的预制件“打开”按钮。 第二就是在Project工程面板中选中预制件文件(Cube.prefab),然后在Inspector检视面板中点击“打开预制件”。 第

    2024年02月04日
    浏览(28)
  • Unity 之预制体(Prefab)的解释以及用法

    Unity中的预制体(Prefab)是一种重要的资源类型,用于创建和管理游戏对象(GameObject)。预制体是一种可重用的模板,可以在游戏场景中多次实例化,使开发人员能够更轻松地创建和管理大量相似的对象。以下是有关Unity预制体的详细介绍,包括其作用和用法: 作用: 重用性

    2024年02月09日
    浏览(39)
  • 第十六章 Unity 预制件prefab(上)

    本章节我们介绍一下“预制件”,也有人叫“预制体”,也就是Prefab。在游戏世界中,那些自然环境的游戏对象,我们可以提前创建在场景中,这个大家能够理解。但是,有些游戏对象,需要根据游戏逻辑来通过代码生成,例如刷新怪物,触发机关等等。Unity 的预制件系统允许

    2024年02月08日
    浏览(53)
  • [Unity]将物体(gameObject)与预制体(Prefab)取消关联,解绑

    在如下Hierarchy窗口中右键点击要解绑的物体  在右键菜单中选择prefab-》Unpack即可将对象与预制体解除关联      

    2024年02月11日
    浏览(46)
  • Unity快速入门教程-详解预制体(Prefab)及其实例化Instantiate

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 博主刚学习unity的时候,在网上找预制体相关的博客,可是很难找到一篇凝练且通俗易懂介绍预制体的文章,浪费了不少时间且难以理解一些文章的内容。自己摸索学习了一段时间过后,总算对预制体有

    2024年02月02日
    浏览(36)
  • Unity如何修改预制体(预制件)?

    【预制件】 预制件作用:方便复用 【预制件】的制作 直接拖拽,从层级面板 - 项目面板。层级面板中当前图标会变蓝,子物体名字变蓝色。预制件是一个文件,可以导出,也方便别人使用。 【预制件】修改 直接修改预制件的属性会影响hierarchy中的游戏对象 直接修改hierar

    2024年04月09日
    浏览(37)
  • Unity AssetsBundle一键为需要打包的预制体设置assetBundle名

    直接看代码:

    2024年02月11日
    浏览(29)
  • 【Unity编辑器扩展】(三)PSD转UGUI Prefab, 一键拼UI解放美术/程序(完结)

    解放UI程序/美术? psd文件一键转ui prefab 支持所有ui类型 支持textmeshpro psd一键转ugui prefab工具 设计原理和详细使用方法 第一步,把psd图层转换为可编辑的节点树,并自动解析UI类型、自动绑定UI子元素:  第二步, 点击“生成UIForm\\\"按钮生成UI预制体 (若有UI类型遗漏可在下拉菜单

    2024年02月13日
    浏览(35)
  • Unity 修改材质球的属性为透明

    新建cube时,Inspector面板中的Material是灰色的,无法修改。 任意选一个材质就可以进行修改了。 在asset store中下载ICE_sushishop,并贴图。

    2024年02月12日
    浏览(36)
  • 第十六章 预制件prefab(上)

    本章节我们介绍一下“预制件”,也有人叫“预制体”,也就是Prefab。在游戏世界中,那些自然环境的游戏对象,我们可以提前创建在场景中,这个大家能够理解。但是,有些游戏对象,需要根据游戏逻辑来通过代码生成,例如刷新怪物,触发机关等等。Unity 的预制件系统允许

    2024年02月02日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包