Unity辅助函数

前言

今天我将向您展示我在所有项目中使用的一些函数基本上我将创建一个名为静态类的类,称为Helpers
嗯,我知道其他人使用不同的名称,例如扩展名和其他东西,但这并不一定有感觉,因为它们不是扩展方法
其中一些是但这些方法非常有用

Camera reference

Camera.main是昂贵的,在Unity后台基本上做的事情是它迭代场景中的所有对象,它试图用标签主相机找到对象,然后返回,因此您应该始终存储对相机的引用,以便在场景加载或脚本加载,
在任何时候这么多不同场景中执行此操作只调用一次Camera.main,所以我想,我只是把它放在助手里。

private static Camera _camera;

public static Camera Camera
{
    get
    {
        if (_camera == null) _camera = Camera.main;
        return _camera;
    }
    private set{}
}

Non-allocating WaitForSeconds

只是让我的协同例程在yield return时获取缓存的等待对象,而非执行一次就创建一次,这样对内存消耗极大
所以每次创建就分配了一部分内存,然后垃圾回收器就必须来清理更多垃圾

//只读,只是说只能在初始化的时候赋值,也就是说new,而不影响内部值的添加删除,只是说的它本身的引用
private static readonly Dictionary<float, WaitForSeconds> _waitDictionary = new Dictionary<float, WaitForSeconds>();

public static WaitForSeconds GetWait(float time)
{
    if (_waitDictionary.TryGetValue(time, out var wait)) return wait;

    _waitDictionary[time] = new WaitForSeconds(time);
    return _waitDictionary[time];
}

IsThePointerOverUI

射线检测,我不相信它竟然不是开发者在Unity默认的做法,
它只会检测你的鼠标光标处或者在手机上的手指按压处是否有UI元素,这是非常通用的方法

private static PointerEventData _eventDataCurrentPosition;
private static List<RaycastResult> _results;

public static bool IsOverUI()
{
    _eventDataCurrentPosition = new PointerEventData(EventSystem.current){position = Input.mousePosition};
    _results = new List<RaycastResult>();
    EventSystem.current.RaycastAll(_eventDataCurrentPosition, _results);
    return _results.Count > 0;
}

Find world point of canvas element

通过传递一个RectTransform来获取对应的世界坐标

public static Vector3 GetWorldPointOfCanvasElement(RectTransform rect)
{
    RectTransformUtility.ScreenPointToWorldPointInRectangle(rect, rect.position, Camera, out var result);
    return result;
}

Quickly destroy all child objects

基本上它可以只提供一个Transform就可以快速迭代摧毁所有子对象
采用的扩展方法的方式
至于为什么只输入transform就能foreach遍历所有子对象而不是提供数组或是列表是因为枚举器和迭代器的原因

public static void DeleteChildren(this Transform t)
{
    foreach (Transform child in t) Object.Destroy(child.gameObject);
}
posted @ 2022-03-30 17:05  yassine  阅读(143)  评论(0编辑  收藏  举报