IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> ugui-prefab-image替换工具 -> 正文阅读

[游戏开发]ugui-prefab-image替换工具

一个简单的prefab上Image/Texture替换工具

using System;
using System.Collections.Generic;
using System.IO;
using UnityEditor;
using UnityEngine;
using UnityEngine.UI;
using Object = UnityEngine.Object;

public class ReplaceSprite : EditorWindow
{

    [MenuItem("Assets/客户端/UI工具/查找引用图片替换")]
    static void SearchRefrencePrefab()
    {
        ReplaceSprite window = (ReplaceSprite)EditorWindow.GetWindow(typeof(ReplaceSprite), false, "Searching", true);
        window.Show();
    }

    private  Object SearchObject;
    private  Sprite TargetObject;
    private  bool IsReplace=false;
    bool showBtn =false;
    private  Vector2 scroPos;
    // private static Object SearchPathPath = null;

    private void OnGUI()
    {
        EditorGUILayout.BeginVertical();
        EditorGUILayout.SelectableLabel("导出节点文本路径:"+m_savepath);
        //this.Repaint();//实时刷新
        EditorGUILayout.EndVertical();
        EditorGUILayout.BeginHorizontal();
        SearchObject = (Sprite)EditorGUILayout.ObjectField(SearchObject, typeof(Object), true, GUILayout.Width(200));
        if (GUILayout.Button("Search", GUILayout.Width(100)))
        {
            if (SearchObject == null)
                return;
            Find();
        }
        TargetObject = (Sprite)EditorGUILayout.ObjectField(TargetObject, typeof(Object), true, GUILayout.Width(200));
        if (GUILayout.Button("Replace", GUILayout.Width(100)))
        {
            if (SearchObject == null)
                return;
            IsReplace = true;
            Find();
        }

        EditorGUILayout.EndHorizontal();
        
        EditorGUILayout.BeginVertical();
        showBtn =EditorGUILayout.Toggle("是否导出查找节点", showBtn,GUILayout.Width(10));
        if(showBtn)
        {
            IsReplace = true;
        }
        if (GUILayout.Button("Clear", GUILayout.Width(100)))
        {
            m_PrefabList.Clear();
            m_prefablable = String.Empty;
        }
        EditorGUILayout.EndVertical();
        
        
        scroPos=GUILayout.BeginScrollView(scroPos, false, true);
        //显示结果
        EditorGUILayout.BeginVertical();
        for (int i = 0; i < m_PrefabList?.Count; i++)
        {
            EditorGUILayout.ObjectField(m_PrefabList[i], typeof(Object), true, GUILayout.Width(300));
        }
        
        EditorGUILayout.EndHorizontal();

        GUILayout.EndScrollView();
        
    }

    public  List<GameObject> GetAllPrefabByDirectory(string path)
    {
        string[] files = Directory.GetFiles(path, "*.prefab", SearchOption.AllDirectories);
        List<GameObject> _prefabList = new List<GameObject>();
        GameObject _prefab;
        foreach (var _path in files)
        {
            _prefab = AssetDatabase.LoadAssetAtPath(_path, typeof(GameObject)) as GameObject;
            _prefabList.Add(_prefab);
        }
        return _prefabList;
    }

     List<GameObject> m_PrefabList = new List<GameObject>();
     string m_savepath = Application.streamingAssetsPath + "/Searching.txt";
     private string m_prefablable = string.Empty;
    
    private  void Find()
    {
        m_prefablable = string.Empty;
        m_PrefabList.Clear();
        string m_sprite = SearchObject.name;
        if (m_sprite == null) return;
        List<Image> _allImageList;
        Debug.Log("选择了:" + m_sprite);

        List<GameObject> _prefabList = GetAllPrefabByDirectory("Assets/Arts/px_ugui/ui_prefab");

        int _length = _prefabList.Count;
        bool _isChanged=false;
        Debug.Log("prefab的数量:" + _prefabList.Count);
        for (int i = 0; i < _prefabList.Count; i++)
        {
            EditorUtility.DisplayCancelableProgressBar("Checking", _prefabList[i].ToString(), (float)i / _length);
            if (_prefabList[i] == null)
            {
                continue;
            }
            _allImageList = new List<Image>(_prefabList[i].GetComponentsInChildren<Image>(true));
            if (_allImageList == null || _allImageList.Count <= 0)
            {
                continue;
            }
            foreach (var image in _allImageList)
            {
                if (image.sprite == null)
                {
                    continue;
                }

                if (image.sprite.Equals(SearchObject))
                {
                    if (TargetObject != null&& IsReplace)
                    {
                        image.sprite = TargetObject;
                        _isChanged = true;

                    }
                    m_prefablable +=i+("--PrefabName:  " + _prefabList[i] + "--节点名:  " + image.gameObject.name + "\n") ;
                    m_PrefabList.Add(_prefabList[i]);

                }
            }

            if (_isChanged)
            {
                PrefabUtility.SavePrefabAsset(_prefabList[i]);
                _isChanged = false;
            }

        }
        EditorUtility.ClearProgressBar();
        Debug.Log("引用图片---" + m_PrefabList.Count + " 个");
        foreach (var item in m_PrefabList)
        {
            if (m_PrefabList.Count <= 0)
            {
                Debug.Log("无引用!");
            }
            else
            {
                Debug.Log(item);
            }
        }

        if (showBtn)
        {
            SaveData();
        }
        else
        {
            if (File.Exists(m_savepath))
            {
                File.Delete(m_savepath);
            }  
        }

    }


     void SaveData()
    {
        //如果本地没有对应的txt 文件,重新创建
        if (!File.Exists(m_savepath))
        {
            File.Create(m_savepath);
        }

        File.WriteAllText(m_savepath, m_prefablable);
        Debug.Log("保存成功");
        AssetDatabase.Refresh();
    }

}

  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2022-01-08 14:22:27  更:2022-01-08 14:23:06 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/27 19:56:15-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码