以下是一个泛型方法的示例,用于将一个 MonoBehaviour 显示在屏幕中心,并用一个 2D 框标出其大小:

using UnityEngine;

public class DisplayAndHighlight<T> where T : MonoBehaviour
{
    public static void DisplayAndHighlightObject(T monoBehaviour)
    {
        // 获取屏幕中心点的位置
        Vector3 screenCenter = new Vector3(Screen.width / 2f, Screen.height / 2f, 0f);

        // 获取 MonoBehaviour 的大小
        Bounds bounds = GetBounds(monoBehaviour);

        // 计算 MonoBehaviour 的屏幕位置
        Vector3 position = screenCenter - bounds.center;

        // 设置 MonoBehaviour 的位置为屏幕中心
        monoBehaviour.transform.position = position;

        // 在屏幕中心绘制一个 2D 框来标出 MonoBehaviour 的大小
        GUI.Box(new Rect(screenCenter.x - bounds.extents.x, screenCenter.y - bounds.extents.y, bounds.size.x, bounds.size.y), "");
    }

    private static Bounds GetBounds(T monoBehaviour)
    {
        // 获取 MonoBehaviour 的所有渲染器
        Renderer[] renderers = monoBehaviour.GetComponentsInChildren<Renderer>();

        // 如果没有渲染器,则使用 MonoBehaviour 的 Collider 来计算边界
        if (renderers.Length == 0)
        {
            Collider collider = monoBehaviour.GetComponent<Collider>();
            if (collider != null)
            {
                return collider.bounds;
            }
        }
        else
        {
            // 计算所有渲染器的合并边界
            Bounds bounds = renderers[0].bounds;
            for (int i = 1; i < renderers.Length; i++)
            {
                bounds.Encapsulate(renderers[i].bounds);
            }
            return bounds;
        }

        // 如果没有渲染器和 Collider,则返回一个默认的边界
        return new Bounds(Vector3.zero, Vector3.zero);
    }
}

使用方法示例:

public class Example : MonoBehaviour
{
    private void Start()
    {
        // 在屏幕中心显示并标出当前脚本所在的 GameObject 的大小
        DisplayAndHighlight<Example>.DisplayAndHighlightObject(this);
    }
}

这个示例方法可以用于任何继承自 MonoBehaviour 的类,例如自定义的脚本类。

Unity 泛型方法:将 MonoBehaviour 显示在屏幕中心并标注大小

原文地址: https://www.cveoy.top/t/topic/o72T 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录