来说说Unity中的那些Utility和Helper们
在日常的开发当中。我们会习惯性的将一些经常用到的工具方法提取出来,放到一个XXUtility中。目的主要是为了为了提高工作效率,优化代码结构。同样在Unity中,引擎默认也给我们提供了很多有用的工具方法。今天我们就来理一理个人觉得比较常用的。编辑器扩展方向
1.JsonUtility——负责Json文件的序列化和反序列化。主要有以下三个方法:
//从object序列化为json字符串
JsonUtility.ToJson(_class1);
//从json字符串反序列化为object
JsonUtility.FromJson<TestClass1>(_jsonStr);
//此方法与JsonUtility.FromJson非常相似,不同之处在于,
//它不是创建新对象并将JSON数据加载到其中,而是将JSON数据加载到现有对象中。
//这使您无需任何分配即可更新存储在类或对象中的值
JsonUtility.FromJsonOverwrite(_jsonStr,this);
需要注意的是:可以序列化的类只包括MonoBehaviour,ScriptableObject或应用了Serializable属性的普通类/结构。不支持的字段将被忽略,私有字段,静态字段和应用了NonSerialized属性的字段也会被忽略。例如自定义的类需要加上。
2.EditorUtility——主要负责编辑器的一些与对话框相关的操作。它的方法挺多,我一般会用到下面几个:
//显示进度条
EditorUtility.DisplayProgressBar(&#34;标题&#34;, &#34;进度条内容&#34;, progress / secs);
//关闭进度条
EditorUtility.ClearProgressBar();
//标准对话框
EditorUtility.DisplayDialog(&#34;标题&#34;,&#34;询问?&#34;, &#34;确定&#34;, &#34;取消&#34;));
此外还可以在组件之间复制序列化值,打开文件面板等。具体可参看文档。
3.GameObjectUtility:
//移除丢失的脚本
GameObjectUtility.RemoveMonoBehavioursWithMissingScript()
下面两个感觉有点重要
4.GUIUtility,RectTransformUtility,GUILayoutUtility——GUI绘制中一些常用的工具方法。
[*]RectTransformUtility 详见:
。这个工具类在UGUI中会经常的用到。
[*]GUILayoutUtility:这几个方法是为编辑器面板布局预留一些空间,如下图就是一种典型的新应用:
public override void OnInspectorGUI () {
Rect rect = GUILayoutUtility.GetRect (200, 100);
Texture2D texture2D = Resources.Load<Texture2D>(&#34;title&#34;);
texture2D.Apply ();
GUI.DrawTexture (rect, texture2D);
GUILayout.Space(20);
if(GUILayout.Button(&#34;测试按钮&#34;)){
}
}
插件的抬头
//为具有特定长宽比的矩形保留布局空间。
public static Rect GetAspectRect(float aspect);
//获取最后由GUILayout用于控件的矩形。
//注意,这只在重绘事件期间起作用。
public static Rect GetLastRect();
//为具有固定内容区域的矩形保留布局空间。
public static Rect GetRect(float width, float height);
[*]GUIUtility:注意在Unity中使用许多2D坐标空间,其中大多数将X定义为向右递增,而Y则向上递增。一个例外是在GUI和GUILayout类中,其中Y向下增加。这里需要特别注意,别弄混了,并且GUIToScreenPoint转换出的屏幕坐标也是Y向下增加的,个人估计主要是为了和GUI匹配吧。主要用到的还是这几个空间转换啦:
5.Handles,HandleUtility——控制柄工具类,功能相当强大,引擎场景视图界面也是用这个类搞定的。
Handles主要提供用于在SceneView中绘制各种控制柄的方法。基础使用可以参考:https://blog.csdn.net/dengshunhao/article/details/83000972,写的比较详细。
HandleUtility则主要提供了一些算法,如各种距离计算方法以及物体选择的方法。
运行时方向
[*]图形几何
1.GeometryUtility——常用几何函数的实用程序类。
//根据给定的位置数组和转换矩阵计算边界框。
Bounds bounds = GeometryUtility.CalculateBounds(positions, transform.localToWorldMatrix);
//输入相机,返回相机视锥体的六个平面,是一个Plane[]
//顺序为: = Left, = Right, = Down, = Up, = Near, = Far
Plane[] planes = GeometryUtility.CalculateFrustumPlanes(cam);
//如果边界框在平面内或与任意平面相交,则返回true。
//TestPlanesAABB函数使用平面数组来测试边界框是否位于截锥体中。
//可以使用这个函数和CalculateFrustumPlanes一起测试一个摄像头的视图是否包含一个对象,
//不管它是否被渲染。
GeometryUtility.TestPlanesAABB(planes, objCollider.bounds)
//从定义多边形的给定顶点列表创建一个平面,只要它们不表示直线或零区域。
//必须有至少三个顶点来创建平面;零,一个或两个顶点导致false返回没有平面。
//这适用于凹多边形和具有多个对齐顶点的多边形,但不适用于自交多边形。
GeometryUtility.TryCreatePlaneFromPolygon(positions, out plane);
部分效果图:
GeometryUtility.CalculateBounds效果
[*]颜色转换
1.ColorUtility——在HtmlStringRGB和UnityColor之间进行转换。曾几何时我还在到处找Unity Color与16进制Color的转换方法。后来才发现,Unity已经自带了。
//UnityColor -> HtmlColor
string colorStr = ColorUtility.ToHtmlStringRGB (Color.green);
string colorStr = ColorUtility.ToHtmlStringRGBA (Color.green);
//HtmlColor(十六进制颜色,注意以#开头) -> UnityColor
ColorUtility.TryParseHtmlString (&#34;#FFFFFFFF&#34;, out c);
2.Color的静态方法:
//HSV->RGB
Color color = Color.HSVToRGB(1,1,1);
//RGB->HSV
Color.RGBToHSV(Color.white,out float h,out float s,out float v);
[*]图片转换
Texture2D texture2D = new Texture2D (1, 1);
byte[] bytes = ImageConversion.EncodeToPNG (texture2D);
ImageConversion.LoadImage (texture2D, bytes);
ImageConversion与Texture2D实例的方法相似。
很少用到的
1.UnsafeUtility——主要是管理Unsafe代码的工具类,就像Unsafe代码一样,一般不会使用到。 Color.Lerp(ColorA,ColorB,t)
页:
[1]