美文网首页
Unity Project资源项目内剪切、复制、粘贴实现

Unity Project资源项目内剪切、复制、粘贴实现

作者: Boyce_Lig | 来源:发表于2023-04-18 16:49 被阅读0次

前言:之前总会遇到一些资源需要复制一份到别的目录去修改的需求,但是每次操作不是要Show in Explorer再执行复制就是要Ctrl+D然后拖拽再改名,所以写了这个脚本。



功能:

  • 复制文件
  • 粘贴文件
  • 剪贴文件
  • 项目内地址自动解析为复制

逻辑:

复制时把所有已选择文件转为unity路径数组记录,使用AssetDatabase.CopyAsset()AssetDatabase.MoveAsset()来实现剪切和粘贴,也就只识别以Assets/目录开头的路径文件或文件夹
并且在ClipboardListener类里做了剪贴板实时监听功能,会把从任何地方复制的满足unity路径的string自动放到粘贴里。

源码:

using System.Collections.Generic;
using System.IO;
using UnityEditor;
using UnityEngine;

public class CopyPasteTool : Editor
{
    public static List<string> copyPaths;
    static bool isCut = false;

    [MenuItem("Assets/剪切")]
    static void Cut()
    {
        Copy();
        isCut = true;
    }
    [MenuItem("Assets/复制")]
    static void Copy()
    {
        if (copyPaths == null)
        {
            copyPaths = new List<string>();
        }
        string[] assetGUIDs = Selection.assetGUIDs;
        copyPaths.Clear();
        for (int i = 0; i < assetGUIDs.Length; i++)
        {
            copyPaths.Add(AssetDatabase.GUIDToAssetPath(assetGUIDs[i]));
        }
        isCut = false;
    }
    [MenuItem("Assets/粘贴")]
    static void Paste()
    {
        for (int i = 0; i < copyPaths.Count; i++)
        {
            string soureName = Path.GetFileName(copyPaths[i]);
            string targetPath = AssetDatabase.GUIDToAssetPath(Selection.assetGUIDs[0]);

            if (Path.HasExtension(targetPath))
            {
                targetPath = Path.GetDirectoryName(targetPath) + @"\" + soureName;
            }
            else
            {
                targetPath += @"\" + soureName;
            }

            if (File.Exists(targetPath))
            {
                int temp = EditorUtility.DisplayDialogComplex("文件重复警告", $"当前目录存在 {soureName},是否替换", "替换", "取消", "重新命名");
                switch (temp)
                {
                    case 0:
                        break;
                    case 1:
                        return;
                    case 2:
                        string soureNameExtension = Path.GetFileNameWithoutExtension(copyPaths[i]);
                        string soureExtension = Path.GetExtension(copyPaths[i]);
                        targetPath = Path.GetDirectoryName(targetPath) + @"\" + soureNameExtension + "_" + soureExtension;
                        break;
                }
            }
            if (isCut)
            {
                AssetDatabase.MoveAsset(copyPaths[i], targetPath);
                isCut = false;
                copyPaths.Clear();
            }
            else
            {
                AssetDatabase.CopyAsset(copyPaths[i], targetPath);
            }

        }
    }
    [MenuItem("Assets/粘贴", validate = true)]
    static bool PasteCheck()
    {
        if (copyPaths == null || copyPaths.Count == 0)
        {
            return false;
        }
        return true;
    }
}


[InitializeOnLoad]
public class ClipboardListener : CopyPasteTool
{
    static ClipboardListener()
    {
        EditorApplication.update += OnEditorUpdate;
    }

    static string previousClipBoardValue;
    private static void OnEditorUpdate()
    {
        if (GUIUtility.systemCopyBuffer != previousClipBoardValue)
        {
            previousClipBoardValue = GUIUtility.systemCopyBuffer;
            if (File.Exists(previousClipBoardValue) && previousClipBoardValue.StartsWith("Assets"))
            {
                if (copyPaths == null)
                {
                    copyPaths = new List<string>();
                }
                copyPaths.Clear();
                copyPaths.Add(previousClipBoardValue);
            }
        }
    }
}

相关文章

  • mac常用快捷方式

    复制:command+C 粘贴:command+V 文件剪切的复制:command+C 文件剪切粘贴:...

  • Vim 笔记 chapter2:复制粘贴、寄存器

    复制与粘贴 Vim 的剪切、复制、粘贴有别于其他编辑器。 命令OthersVim复制copyyank剪切cutde...

  • 键盘操作

    键盘操作:全选、复制、剪切、粘贴 实现方式: 需要引入Keys()from selenium.webdriver....

  • js 复制到剪切板

    需求内容: 实现后台返回链接点击复制到剪切板,粘贴分享。 实现方法:

  • 这些Win10自带的高效工具你用过吗?

    Win+V 剪切板 这个剪切板的作用是什么? 以前的你是:复制→粘贴→复制→粘贴→复制→粘贴 用 Win+V 之后...

  • 2018-11-19

    vim基础操作 一、游标移动 上下左右 跳转 二、插入 三、剪切(删除)复制粘贴 剪切(删除) 复制 粘贴 四、其...

  • vim命令整理之复制粘贴

    剪切,复制,粘贴 剪切 d命令不仅删除文本,它还“剪切”文本。每次我们使用d命令,删除的部分被复制到一个粘贴缓冲区...

  • Vi编辑器基本的操作命令

    复制,粘贴:yy:复制 光标所在的这一行4yy:复制 光标所在行开始向下的4行p: 粘贴 剪切dd: 剪切 光标所...

  • iOS Pasteboard详解(复制, 粘贴)

    在项目中UIPasteboard的用途 在项目中基本都会用到复制, 粘贴, 选择, 全选, 剪切功能. UIPas...

  • 剪切-复制-粘贴

    "剪切-复制-粘贴" 可能是数字世界使用最多的一个功能。这项功能的发明人是美国的Larry Tesler,他2月1...

网友评论

      本文标题:Unity Project资源项目内剪切、复制、粘贴实现

      本文链接:https://www.haomeiwen.com/subject/gxzhjdtx.html