IT圈老男孩1 发表于 2022-12-2 09:16

来说说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("标题", "进度条内容", progress / secs);
//关闭进度条
EditorUtility.ClearProgressBar();
//标准对话框
EditorUtility.DisplayDialog("标题","询问?", "确定", "取消"));
此外还可以在组件之间复制序列化值,打开文件面板等。具体可参看文档。
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>("title");
      texture2D.Apply ();
      GUI.DrawTexture (rect, texture2D);
      GUILayout.Space(20);
      if(GUILayout.Button("测试按钮")){   
      }
    }



插件的抬头

//为具有特定长宽比的矩形保留布局空间。
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 ("#FFFFFFFF", 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代码一样,一般不会使用到。

Doris232 发表于 2022-12-2 09:25

Color.Lerp(ColorA,ColorB,t)
页: [1]
查看完整版本: 来说说Unity中的那些Utility和Helper们