Unity 泛型方法:将 MonoBehaviour 显示在屏幕中心并标注大小
以下是一个泛型方法的示例,用于将一个 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 的类,例如自定义的脚本类。
原文地址: https://www.cveoy.top/t/topic/o72T 著作权归作者所有。请勿转载和采集!