比如,目前导入了一个obj文件,想知道它的AABB包围盒是什么。

官方文档

Unity – Scripting API: Bounds (unity3d.com)

可以看到,包围盒有三个类别的:

Mesh.bounds

Unity – Scripting API: Mesh.bounds (unity3d.com)

不随gameobject的几何变换而变换,大概是直接用obj里的顶点坐标算出来的;也就是所谓的模型坐标系。

api怎么调用的?主要就是这几句:

试一试

using System.Collections;using System.Collections.Generic;using UnityEngine;public class BoundTest : MonoBehaviour{// Start is called before the first frame updatevoid Start(){Mesh mesh = GetComponent().mesh;Bounds bounds = mesh.bounds;print(bounds.center); // 把文档里的属性,都打印出来看看print(bounds.size);print(bounds.min);print(bounds.max);print(bounds.extents);}// Update is called once per framevoid Update(){}}

关于文档里面not change的演示:

代码:

using System.Collections;using System.Collections.Generic;using UnityEngine;public class BoundTest : MonoBehaviour{private Mesh mesh;private Bounds bounds;// Start is called before the first frame updatevoid Start(){mesh = GetComponent().mesh;// bounds = mesh.bounds; // 不能放到这里的,放在这里的话,每帧打印的都是同一个bounds;就算是rend.bounds,打印结果也不变}// Update is called once per framevoid Update(){bounds = mesh.bounds; // 应该实时获取print(bounds.center);}}

结果:

Render.bounds

Unity – Scripting API: Renderer.bounds (unity3d.com)

主要是这么几句:

试一试

代码:

using System.Collections;using System.Collections.Generic;using UnityEngine;public class BoundTest : MonoBehaviour{private Mesh mesh;private Renderer rend;private Bounds bounds;// Start is called before the first frame updatevoid Start(){mesh = GetComponent().mesh;rend = GetComponent();}// Update is called once per framevoid Update(){//bounds = mesh.bounds;bounds = rend.bounds; // 实时获取包围盒,才能看到变没变print(bounds.center);}}

后记

知道这些,其实就差不多了。

更详细的可以看这些:

(87条消息) Unity Bounds的理解_一梭键盘任平生的博客-CSDN博客

(87条消息) 【Unity3D】绘制物体外框线条盒子_unity 绘制线框_little_fat_sheep的博客-CSDN博客

总结的很好的: