当前位置: 首页 > news >正文

unity给物体添加可以包裹所有子物体的BoxCollider

代码如下可直接调用

  MeshTool.SpawnCollider(mode);
using UnityEngine;public class MeshTool
{public static Bounds SpawnCollider(Transform target){Vector3 pMax = Vector3.zero;Vector3 pMin = Vector3.zero;Vector3 center = Vector3.zero;Vector3 oldPos = target.transform.position;Quaternion oldQua = target.transform.rotation;Vector3 oldScale = target.transform.localScale;target.transform.position = Vector3.zero;target.transform.rotation = Quaternion.identity;target.transform.localScale = Vector3.one;Bounds bounds = CalcBounds(target, ref pMax, ref pMin, ref center);BoxCollider collider = target.GetComponent<BoxCollider>();if (collider == null){collider = target.gameObject.AddComponent<BoxCollider>();}collider.center = bounds.center;collider.size = bounds.size;target.transform.position = oldPos;target.transform.rotation = oldQua;target.transform.localScale = oldScale;return bounds;}private static Bounds CalcBounds(Transform obj, ref Vector3 pMax, ref Vector3 pMin, ref Vector3 center){Renderer meshRenderer = obj.GetComponent<Renderer>();if (meshRenderer != null){Bounds b = meshRenderer.bounds;pMax = b.max;pMin = b.min;center = b.center;}RecursivelyCalcBounds(obj.transform, ref pMax, ref pMin);CalculateCenter(pMax, pMin, out center, ref pMax, ref pMin);Vector3 size = new Vector3(pMax.x - pMin.x, pMax.y - pMin.y, pMax.z - pMin.z);Bounds bound = new Bounds(center, size);return bound;}private static void CalculateCenter(Vector3 max, Vector3 min, out Vector3 center, ref Vector3 pMax, ref Vector3 pMin){float xc = (pMax.x + pMin.x) / 2f;float yc = (pMax.y + pMin.y) / 2f;float zc = (pMax.z + pMin.z) / 2f;center = new Vector3(xc, yc, zc);}private static void RecursivelyCalcBounds(Transform obj, ref Vector3 pMax, ref Vector3 pMin){if (obj.transform.childCount <= 0){return;}foreach (Transform item in obj){Renderer m = item.GetComponent<Renderer>();if (m != null){Bounds b = m.bounds;if (pMax.Equals(Vector3.zero) && pMin.Equals(Vector3.zero)){pMax = b.max;pMin = b.min;}if (b.max.x > pMax.x){pMax.x = b.max.x;}if (b.max.y > pMax.y){pMax.y = b.max.y;}if (b.max.z > pMax.z){pMax.z = b.max.z;}if (b.min.x < pMin.x){pMin.x = b.min.x;}if (b.min.y < pMin.y){pMin.y = b.min.y;}if (b.min.z < pMin.z){pMin.z = b.min.z;}}RecursivelyCalcBounds(item, ref pMax, ref pMin);}}}
http://www.lryc.cn/news/343480.html

相关文章:

  • 2024五一数学建模A题思路代码与论文分析
  • ICode国际青少年编程竞赛- Python-1级训练场-基础训练2
  • 科技控必看!让你轻松成为机器人领域达人
  • Linux进程——Linux下常见的进程状态
  • TCP长连接短链接
  • 代码随想录35期Day33-Java
  • PMP考试没过怎么办?如何补考?(附复核流程)
  • 自主实现Telnet流量抓取
  • 以瓦片地图为底图添加图表,保留拖拽功能
  • Windows cmd bat之特殊符号及变量
  • 用python写个控制MicroSIP自动拨号和定时呼叫功能(可用在小型酒店叫醒服务)
  • axios 取消token 模糊搜索
  • 【OTS4WORD】“精简并行过程”——容易剪裁的“软件过程改进方法和规范”模板
  • 22 | MySQL有哪些“饮鸩止渴”提高性能的方法?
  • 【AIGC调研系列】VILA-1.5版本的视频理解功能如何
  • 如何解决WordPress邮件发送和接收问题
  • MySQL学习笔记10——日志
  • OpenSPG docker 安装教程
  • TypeScript学习日志-第十六天(泛型)
  • Flutter路由跳转的两种方式
  • Hydroxyethyl-PEG-Hydroxyethyl,Hy-PEG-Hy是一种由聚乙二醇(PEG)和二酰肼单元构成的嵌段共聚物
  • 链表面试题目:反转一个单链表的两种方法(解析+代码)
  • [C++][数据结构]AVL树插入的模拟实现
  • 力扣每日一题108:将有序数组转换为二叉搜索树
  • 保护公司机密:避免员工带着数据说拜拜
  • kali apt update报错
  • 7-1 图图图
  • Java(多线程)
  • 程序员必备的7大神器,效率飞起!
  • 揭秘文件加密利器:24年度最值得信赖的5大加密软件评测