Unity Editor Cheat Sheet

文件操作

临时更换Unity工程路径

更换路径用于 访问非以Unity的工程路径开头的相对路径文件

比如 Raw/Test/a.txt 相对路径写为../../a.txt 这个相对路径是针对Raw文件夹的,所以取文件绝对路径时候先要切换到Raw路径下

1
2
3
4
var originalPath = Environment.CurrentDirectory;
Environment.CurrentDirectory = 临时绝对路径
//逻辑代码
Environment.CurrentDirectory=originalPath

取得 相对路径的 文件或目录 的 绝对路径

1
2
3
4
5
6
7
8

private const string DIC_PATH = "../Raw/Dic";
private const string FILE_PATH = "../Raw/Dic/t.txt";

var fInfo = new FileInfo(FILE_PATH);
var dicInfo = new DirectoryInfo(DIC_PATH);
Debug.Log(fInfo.FullName)
Debug.Log(dicInfo.FullName)

在Editor中加载文件

读取Unity工程目录下的任意文件

  • 类型: 比如 TextAsset,Texture,Sound,Gameobject等等
  • 文件相对路径: 一般以”Assets/“开头,比如Resources目录对应的就是”Assets/Resources”

注意: AssetDatabase.LoadAssetAtPath 只能加载工程目录下的文件,比如你再工程目录外放置了一个a.txt,想把这个文件给load进来是不行的.

1
var file = AssetDatabase.LoadAssetAtPath<类型>(文件相对路径)

系统无关分隔符 Path.DirectorySeparatorChar

Path.DirectorySeparatorChar 在Mac上是 “/“ 在Windows上面是 “\”

  • Mac: /Users/eran/Desktop/a.rar

  • Windows: C:\Windwos\Desktop\a.rar

遍历文件夹下的所有文件

遍历给定文件夹下,所以指定后缀的文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public static void ForEachFileUnderFolder(string _folderPath, string[] _suffixs, Action<FileInfo, string> _callBack)
{
if (string.IsNullOrEmpty(_folderPath) || _suffixs == null || _suffixs.Length == 0)
{
Debug.Log($"Loop 输入参数不合法 路径:{_folderPath}");
return;
}

DoLoopEachFolder(new DirectoryInfo(_folderPath), _suffixs, _callBack);
}

private static void DoLoopEachFolder(DirectoryInfo _folder, string[] _suffixs, Action<FileInfo, string> _callBack)
{
foreach (var file in _folder.GetFiles())
{
var suffix = _suffixs.FirstOrDefault(s => file.Name.EndsWith(s));
if (!string.IsNullOrEmpty(suffix))
{
_callBack(file, suffix);
}
}

foreach (var subFolder in _folder.GetDirectories())
{
DoLoopEachFolder(subFolder, _suffixs, _callBack);
}
}

用例:

1
2
3
4
var path = "/User/xxx";
ForEachFileUnderFolder(path,new[] {"lua","png"},(_fileInfo,_suffix)=>{
//执行相关逻辑
});

编辑器设置

重力调整

调整重力数值时候,需要同时调整SleepThreshold,否则物体无法休眠

Inspector可显示: [System.Serializable] 标签

Class加入[System.Serializable] 可以在Inspector中看到其内部属性 LINK

1
2
3
4
5
6
7
8
using UnityEngine;

[System.Serializable]
class Test : System.Object
{
public int p = 5;
public Color c = Color.white;
}

Meta数据源: [CreateAssetMenu] 标签

使用该标签配合ScriptableObject基类 可以创建Meta数据源 LINK

1
2
3
4
[CreateAssetMenu (menuName = "Meta/WeaponInfo")]
public class MetaWeaponInfo : ScriptableObject
{
}

GUI

Gizmos.matrix

1
Gizmos.matrix = _target.localToWorldMatrix;

将Gizmos坐标系调整到对象当前所在的位置,这样后面的Gizmos操作可以直接以(0,0)点计算,不用考虑目标的偏移

Handles.DrawAAPolyLine Handles.DrawSolidRectangleWithOutline

1
Handles.DrawAAPolyLine($线条粗细,$零点坐标Array);

画粗线,Gizmos.DrawLine只能画1px的细线. 这个就是Editor模式下的LineRender

无法设置颜色,只能是纯白色.尝试设置两个像素的Color LineTexture 失败

1x2 pixels with one transparent white pixel and one opaque white pixel

就真的只能是白色的.. 鸡肋😡

使用

1
Handles.DrawSolidRectangleWithOutline

替换画粗线功能即可.

EditorUtility.SetDirty

当鼠标移动时候在场景上绘制图形,需要手工调用EditorUtility.SetDirty 否则场景上的图形不更新

HandleUtility.AddDefaultControl

1
HandleUtility.AddDefaultControl(GUIUtility.GetControlID(GetHashCode(), FocusType.Passive));

防止在屏幕上点击导致当前SelectObject发生改变

坚持原创技术分享,您的支持将鼓励我继续创作!