1.EditorWindow通过拖拽获取文件夹或者文件路径

#region 拖拽相关

Rect rect4 = EditorGUILayout.GetControlRect();

//将上面的框作为文本输入框

selectPath = EditorGUI.TextField(rect4, selectPath);

//subPath = EditorGUILayout.TextField(subPath);

//如果鼠标正在拖拽中或拖拽结束时,并且鼠标所在的位置在文本输入框内

if ((Event.current.type == EventType.DragUpdated || Event.current.type == EventType.DragExited) && rect4.Contains(Event.current.mousePosition))

{

DragAndDrop.visualMode = DragAndDropVisualMode.Generic;

if (DragAndDrop.paths != null && DragAndDrop.paths.Length > 0)

{

selectPath = DragAndDrop.paths[0];

}

}

#endregion

2.反序列化

public static Object GetObjectFromBytes(byte[] datas)

{

if (datas == null || datas.Length == 0)

return null;

BinaryFormatter bf = new BinaryFormatter();

using (MemoryStream stream = new MemoryStream(datas, 0, datas.Length))

{

Object obj = bf.Deserialize(stream) as Object;

stream.Dispose();

return obj;

}

}

3.保存到文件

bool SaveLocalFile(string path, byte[] data)

{

if (File.Exists(path))

File.Delete(path);

using (FileStream fs = new FileStream(path, FileMode.CreateNew))

{

if (fs == null)

return false;

fs.Write(data, 0, data.Length);

AssetDatabase.Refresh();

AssetDatabase.ImportAsset(path, ImportAssetOptions.ForceUpdate);

return true;

}

}

4.取文件

public byte[] GetLocalFile(string path)

{

if (File.Exists(path) == false)

return null;

using (FileStream fs = new FileStream(path, FileMode.Open))

{

if (fs == null || fs.Length == 0)

return null;

byte[] data = new byte[fs.Length];

fs.Read(data, 0, data.Length);

return data;

}

}

5.调用windows系统dialog 选择文件夹

#region 调用windows系统dialog 选择文件夹

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]

public class OpenDialogFile

{

public int structSize = 0;

public IntPtr dlgOwner = IntPtr.Zero;

public IntPtr instance = IntPtr.Zero;

public String filter = null;

public String customFilter = null;

public int maxCustFilter = 0;

public int filterIndex = 0;

public String file = null;

public int maxFile = 0;

public String fileTitle = null;

public int maxFileTitle = 0;

public String initialDir = null;

public String title = null;

public int flags = 0;

public short fileOffset = 0;

public short fileExtension = 0;

public String defExt = null;

public IntPtr custData = IntPtr.Zero;

public IntPtr hook = IntPtr.Zero;

public String templateName = null;

public IntPtr reservedPtr = IntPtr.Zero;

public int reservedInt = 0;

public int flagsEx = 0;

}

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]

public class OpenDialogDir

{

public IntPtr hwndOwner = IntPtr.Zero;

public IntPtr pidlRoot = IntPtr.Zero;

public String pszDisplayName = null;

public String lpszTitle = null;

public UInt32 ulFlags = 0;

public IntPtr lpfn = IntPtr.Zero;

public IntPtr lParam = IntPtr.Zero;

public int iImage = 0;

}

public class DllOpenFileDialog

{

[DllImport("Comdlg32.dll", SetLastError = true, ThrowOnUnmappableChar = true, CharSet = CharSet.Auto)]

public static extern bool GetOpenFileName([In, Out] OpenDialogFile ofn);

[DllImport("Comdlg32.dll", SetLastError = true, ThrowOnUnmappableChar = true, CharSet = CharSet.Auto)]

public static extern bool GetSaveFileName([In, Out] OpenDialogFile ofn);

[DllImport("shell32.dll", SetLastError = true, ThrowOnUnmappableChar = true, CharSet = CharSet.Auto)]

public static extern IntPtr SHBrowseForFolder([In, Out] OpenDialogDir ofn);

[DllImport("shell32.dll", SetLastError = true, ThrowOnUnmappableChar = true, CharSet = CharSet.Auto)]

public static extern bool SHGetPathFromIDList([In] IntPtr pidl, [In, Out] char[] fileName);

}

public string OpenWindowsDialog()

{

OpenDialogDir ofn2 = new OpenDialogDir();

ofn2.pszDisplayName = new string(new char[2000]); ;     // 存放目录路径缓冲区

ofn2.lpszTitle = "Open Project";// 标题

//ofn2.ulFlags = BIF_NEWDIALOGSTYLE | BIF_EDITBOX; // 新的样式,带编辑框

IntPtr pidlPtr = DllOpenFileDialog.SHBrowseForFolder(ofn2);

char[] charArray = new char[2000];

for (int i = 0; i < 2000; i++)

charArray[i] = '\0';

DllOpenFileDialog.SHGetPathFromIDList(pidlPtr, charArray);

string fullDirPath = new String(charArray);

fullDirPath = fullDirPath.Substring(0, fullDirPath.IndexOf('\0'));

return fullDirPath;//这个就是选择的目录路径。

}

#endregion

voidOnGUI(){
targetGo =(GameObject)EditorGUILayout.ObjectField(targetGo,typeof(GameObject),true);
subPath = targetGo ==null? subPath : targetGo.name;EditorGUILayout.LabelField(string.Format("保存路径output path:{0}",Path.Combine(path, subPath)));//获得一个长300的框 Rect rect =EditorGUILayout.GetControlRect(GUILayout.Width(300));//将上面的框作为文本输入框
path =EditorGUI.TextField(rect, path);
subPath =EditorGUILayout.TextField(subPath);//如果鼠标正在拖拽中或拖拽结束时,并且鼠标所在位置在文本输入框内 if((Event.current.type==EventType.DragUpdated||Event.current.type==EventType.DragExited)&& rect.Contains(Event.current.mousePosition)){//改变鼠标的外表 DragAndDrop.visualMode=DragAndDropVisualMode.Generic;if(DragAndDrop.paths!=null&&DragAndDrop.paths.Length>0){
path =DragAndDrop.paths[0];}}……}

unity工具开发的更多相关文章

  1. unity 工具开发基础

    using System.Collections; using System.Collections.Generic; using System.IO; using System.Text; usin ...

  2. C# Unity游戏开发——Excel中的数据是如何到游戏中的 (三)

    本帖是延续的:C# Unity游戏开发——Excel中的数据是如何到游戏中的 (二) 前几天有点事情所以没有继续更新,今天我们接着说.上个帖子中我们看到已经把Excel数据生成了.bin的文件,不过其 ...

  3. C# Unity游戏开发——Excel中的数据是如何到游戏中的 (四)2018.4.3更新

    本帖是延续的:C# Unity游戏开发--Excel中的数据是如何到游戏中的 (三) 最近项目不算太忙,终于有时间更新博客了.关于数据处理这个主题前面的(一)(二)(三)基本上算是一个完整的静态数据处 ...

  4. 【Unity】开发WebGL内存概念具体解释和遇到的问题

    自增加unity WebGL平台以来.Unity的开发团队就一直致力于优化WebGL的内存消耗. 我们已经在Unity使用手冊上有对于WebGL内存管理的详尽分析,甚至在Unite Europe 20 ...

  5. unity开发android游戏(一)搭建Unity安卓开发环境

    unity开发android游戏(一)搭建Unity安卓开发环境 分类: Unity2014-03-23 16:14 5626人阅读 评论(2) 收藏 举报 unity开发androidunity安卓 ...

  6. unity 3d开发的大型网络游戏

    unity 3d开发的大型网络游戏 一.总结 1.unity的官网上面应该有游戏列表 2.unity3D是很好的3d游戏引擎,也支持2d,也能做很多画面精良的3A级游戏 3.范围:电脑游戏,手机游戏, ...

  7. 【远程文件浏览器】Unity+Lua开发调试利器

    Remote File Explorer是一个跨平台的远程文件浏览器,用户通过Unity Editor就能操作运行在手机上的游戏或是应用的的目录文件.比如当项目打包运行到设备上时,可通过Remote ...

  8. Unity3d入门 - 关于unity工具的熟悉

    上周由于工作内容较多,花在unity上学习的时间不多,但总归还是学习了一些东西,内容如下: .1 根据相关的教程在mac上安装了unity. .2 学习了unity的主要的工具分布和对应工具的相关的功 ...

  9. 关于Unity游戏开发方向找工作方面的一些个人看法

     这是个老生常谈,却又是谁绕不过去的话题,而对于每个人来说,所遇到的情况又不尽相同,别人的求职方式和路线不一定适合你,即使是背景很相似的两个人,有时候机遇也很重要. 我本人的工作经验只有一年,就业方式 ...

随机推荐

  1. SpringBoot自定义注解、AOP打印日志

    前言 在SpringBoot中使用自定义注解.aop切面打印web请求日志.主要是想把controller的每个request请求日志收集起来,调用接口.执行时间.返回值这几个重要的信息存储到数据库里 ...

  2. js 设计模式——策略模式

    策略模式(Strategy) 定义:将定义的一组算法封装起来,使其相互之间可以替换.封装的算法具有一定的独立性,不会随客户端的变化而变化 废话不多说,先来个例子 // 例如要写一个计算两个数加减乘除的 ...

  3. ios浏览器调试踩坑(1)----mescroll.js和vue-scroller

    主要记录在ios浏览器出现触摸无限加载的情况 使用vue-scroller和mescroll.js/mescroll.vue先踩ios浏览器默认滑动会影响mescroll的方法调用. 首先给公共js加 ...

  4. 电信NBIOT 3 - 数据下行

    电信NBIOT 1 - 数据上行(中国电信开发者平台对接流程) 电信NBIOT 2 - 数据上行(中间件获取电信消息通知) 电信NBIOT 3 - 数据下行 电信NBIOT 4 - NB73模块上行测 ...

  5. sqlmap 注入的方法及技巧

    sqlmap 注入的方法及技巧 当给 sqlmap 这么一个 url 的时候,它会: 1.判断可注入的参数 2.判断可以用那种 SQL 注入技术来注入 3.识别出哪种数据库 4.根据用户选择,读取哪些 ...

  6. [TCP/IP] TCP的报文头

    1.源端口和目的端口:各占2个字节,分别写入源端口和目的端口: 2.序列号:占4个字节,TCP连接中传送的字节流中的每个字节都按顺序编号.例如,一段报文的序号字段值是 301 ,而携带的数据共有100 ...

  7. INPUT输入子系统【转】

    转自:https://www.cnblogs.com/deng-tao/p/6094049.html 1.Linux系统支持的输入设备繁多,例如键盘.鼠标.触摸屏.手柄或者是一些输入设备像体感输入等等 ...

  8. 远程唤醒、WOL、Magic_Packet【转】

    转自:https://www.cnblogs.com/zhuimengle/p/5898830.html 原文:http://blog.csdn.net/flyoxs/article/details/ ...

  9. 十六、MySQL授权命令grant的使用方法

    MySQL 赋予用户权限命令的简单格式可概括为: grant 权限 on 数据库对象 to 用户 一.grant 普通数据用户,查询.插入.更新.删除 数据库中所有表数据的权利. grant sele ...

  10. Ubuntu下安装Rabbitmq和golang环境

    安装及配置Rabbitmq 1. 安装: sudo apt-get install rabbitmq-server 2. 启动web管理插件 sudo rabbitmq-plugins enable ...