首页 > 其他分享 >unity让BoxCollider自适配大小

unity让BoxCollider自适配大小

时间:2023-05-09 09:33:36浏览次数:30  
标签:center BoxCollider 适配 Vector3 bounds unity renders gameObject var

1.一个空物体下面有若干个子物体,想要为空物体添加碰撞盒且碰撞盒还得要包裹所有子物体,手动拖动的话有点费时,费力,费眼,这时候有个工具是最好用的(如下图所示)

 2.选中空物体点击(如下图所示)

 3.就会变成如下图所示方便快捷

 代码如下(编辑器脚本)

using UnityEngine;
using UnityEditor;
/// <summary>
/// 选择一个物体给当前物体添加自适应碰撞盒 编辑器脚本
/// </summary>
public class BoundsTool
{
    [MenuItem("Tools/添加自适应碰撞盒")]
    private static void AutoBoxCollider()
    {
        //如果未选中任何物体 返回
        GameObject gameObject = Selection.activeGameObject;
        if (gameObject == null) return;
        //计算中心点
        Vector3 center = Vector3.zero;
        var renders = gameObject.GetComponentsInChildren<Renderer>();
        for (int i = 0; i < renders.Length; i++)
        {
            center += renders[i].bounds.center;
        }
        center /= renders.Length;
        //创建边界盒
        Bounds bounds = new Bounds(center, Vector3.zero);
        foreach (var render in renders)
        {
            bounds.Encapsulate(render.bounds);
        }
        //先判断当前是否有碰撞器 进行销毁
        var currentCollider = gameObject.GetComponent<Collider>();
        if (currentCollider != null) Object.DestroyImmediate(currentCollider);
        //添加BoxCollider 设置中心点及大小
        var boxCollider = gameObject.AddComponent<BoxCollider>();
        boxCollider.center = bounds.center - gameObject.transform.position;
        boxCollider.size = bounds.size;
    }
}
编辑器脚本

 

(代码添加使用方法)

 /// <summary>
    /// 自动调节碰撞盒的大小
    /// </summary>
    /// <param name="obj_"></param>
    public void AutoBoxCollider(GameObject obj_)
    {
        //如果未选中任何物体 返回
        GameObject gameObject = obj_;
        if (gameObject == null) return;
        //计算中心点
        Vector3 center = Vector3.zero;
        var renders = gameObject.GetComponentsInChildren<Renderer>();
        for (int i = 0; i < renders.Length; i++)
        {
            center += renders[i].bounds.center;
        }
        center /= renders.Length;
        //创建边界盒
        Bounds bounds = new Bounds(center, Vector3.zero);
        foreach (var render in renders)
        {
            bounds.Encapsulate(render.bounds);
        }
        //先判断当前是否有碰撞器 进行销毁
        var currentCollider = gameObject.GetComponent<Collider>();
        if (currentCollider != null) UnityEngine.Object.DestroyImmediate(currentCollider);
        //添加BoxCollider 设置中心点及大小
        var boxCollider = gameObject.AddComponent<BoxCollider>();
        if (!gameObject.GetComponent<Highlighter>())
        {
            gameObject.AddComponent<Highlighter>();          
        }    
        boxCollider.center = bounds.center - gameObject.transform.position;
        boxCollider.size = bounds.size;
    }
程序调用使用

 

最后在加一个设置模型中心点的方法吧,简单记录一下

  List<GameObject> ObjZ = new List<GameObject>();
    Vector3 posZ = Vector3.zero;
    /// <summary>
    /// 设置模型的中心点,方便做模型的移动
    /// </summary>
    /// <param name="_trans"></param>
    public void SetModelPos(Transform _trans)
    {
        yield return new WaitForSeconds(0.2f);
        posZ = Vector3.zero;
        ObjZ.Clear();
        for (int i = 0; i < _trans.childCount; i++)
        {
            posZ += (_trans.GetChild(i).GetComponent<MeshCollider>().bounds.center);
            ObjZ.Add(_trans.GetChild(i).gameObject);
        }
        posZ /= _trans.childCount;
        for (int i = 0; i < ObjZ.Count; i++)
        {
            ObjZ[i].transform.parent = null;
        }
        _trans.position = posZ;
        for (int i = 0; i < ObjZ.Count; i++)
        {
            ObjZ[i].transform.parent = _trans;
        }     
    }
设置模型的中心点位置

 

本次就这么多了哦,有需要会继续添加

 

标签:center,BoxCollider,适配,Vector3,bounds,unity,renders,gameObject,var
From: https://www.cnblogs.com/qq2351194611/p/17383842.html

相关文章

  • 汽车之家Unity前端通用架构升级实践
    背景介绍随着之家3D虚拟化需求的增加,各产品线使用Unity引擎的项目也越来越多,新老项目共存,代码维护成本也随之增加。代码质量参差加之代码规范仍没有完全统一产生高昂学习成本进一步加重了项目维护负担。为应对这些问题,我们决定借助主机厂数科产品线销冠神器VR版本......
  • 关于 mybatis-spring-boot-starter 的版本适配问题
    写在前面:本人就读于某不知名二本计科专业,目前大二,正在自学SpringBoot。博客中难免出现谬误,请大家批评指正,不喜勿喷,键盘侠手下留情。开发环境:IDEA2022.3.2JDK1.8SpringBoot2.7.11Maven3.9.0问题描述:最近在写一个SpringBoot项目,整合了Mybatis,在程序运行时出现如下报错......
  • 京东小程序折叠屏适配探索
    前言随着近年来手机行业的飞速发展,手机从功能机进入到智能机,手机屏幕占比也随着技术和系统的进步越来越大,特别是Android10推出以后,折叠屏逐渐成为Android手机发展的趋势。图1Android手机屏幕发展趋势京东小程序近年来也支持了越来越多的业务和应用,做好小程序的折叠屏的适配......
  • 京东小程序折叠屏适配探索 | 京东云技术团队
    前言随着近年来手机行业的飞速发展,手机从功能机进入到智能机,手机屏幕占比也随着技术和系统的进步越来越大,特别是Android10推出以后,折叠屏逐渐成为Android手机发展的趋势。图1Android手机屏幕发展趋势京东小程序近年来也支持了越来越多的业务和应用,做好小程序的折叠屏的适配也是......
  • Unity常用事件函数
    1publicclassEventFunction:MonoBehaviour2{3publicfloatattackValue=10000;4publicfloatcurrentHP;56//对变量赋值的顺序(左边最先赋值,右边最后赋值,以此类推):7//变量声明并直接赋值>检视面板赋值>Awake>OnEnable>Start>外部赋......
  • 【U3D】对GridLayoutGourp的重写实现适配
    原因是在做一个项目的时候,策划要求的展示效果与grid的实现效果不一致Grid对最后不能铺满的一行不能根据设置的Alignment进行对齐,又不懒得自己去算。故此对GridLayoutGourp进行重写,实现最后一行按照Alignment进行对齐usingSystem.Collections;usingSystem.Collections.Generic......
  • SLQ_C# DataAdapter数据适配器的4个属性
    DataAdapter数据适配器的4个属性:1.SelectCommand属性:向数据库发送查询SQL语句。2.DeleteCommand属性:向数据库发送删除SQL语句。3.InsertCommand属性:向数据库发送插入SQL语句。4.UpdateCommand属性:向数据库发送更新SQL语句。......
  • vue-移动端开发-样式适配方案
    样式适配场景:一个项目中既包含了web端也包含了移动端的页面,web端的一些样式不能在移动端正常显示解决方式:npmipostcss-px-to-viewport项目目录下postcss.config.jsmodule.exports={plugins:{"postcss-px-to-viewport":{unitToConvert:"px",view......
  • Android 横竖屏切换适配
    Android横竖屏幕切换(layout-land和layout-port)(betheme.net)  创建(layout-land和layout-port)文件夹 land是横向port是竖向 (332条消息)layout的横竖屏处理_layout横屏显示_ycb1689的博客-CSDN博客  ......
  • Android 屏幕适配
    一、概念1.1屏幕像素密度PPI、DPIPPI(PixelsPerInch)屏幕每英寸容纳多少个像素点,DPI(DotsPerInch)这个“点”是根据屏幕物理概念产生的一个软件概念,在不同行业有不同理解,印刷行业每英寸打印多少个墨点,鼠标移动一英寸光标移动多少像素点,在Android中被用来表示屏幕每英寸显示多......