Unity开发优化----删除多余的MeshCollider和Animation组件

2023-11-02

     手游项目做碰撞的时候,有关一切物理的东西Unity对手机支持的并不好,多余的MeshCollider 和Animation 空的组件,这俩东西很占效率的。比如下图这样的组件。


      还有场景的材质最好用Mobile/Diffuse,它会比Diffuse的shader效率高很多,因为它会减少每个点的一次乘法。但是有时候美术需要做贴图的变色, 那就不能用Mobile/Diffuse了。但是后来我看了一下有很多材质用的是Diffuse,但是颜色那里是纯白色,那么shader在渲染的时候每个点都多余的进行了一次乘法的运算(效率白白的浪费了)。。。

     作为程序我们首先要避免策划和美术犯错,果断的写一个插件吧,美术在上传场景之前先运行一下插件,把没用的组件删除掉。

[MenuItem("Tools/删除场景没用的MeshCollider和Animation")]
	static public void Remove()
	{
	  //获取当前场景里的所有游戏对象
		GameObject []rootObjects = (GameObject[])UnityEngine.Object.FindObjectsOfType(typeof(GameObject));
		//遍历游戏对象
		foreach(GameObject go in rootObjects)
		{
		  //如果发现Render的shader是Diffuse并且颜色是白色,那么将它的shader修改成Mobile/Diffuse
			if(go != null && go.transform.parent != null)
			{
					Renderer render = go.GetComponent<Renderer>();
				  if( render != null &&render.sharedMaterial != null && render.sharedMaterial.shader.name == "Diffuse" && render.sharedMaterial.color == Color.white)
					{
					  render.sharedMaterial.shader = Shader.Find("Mobile/Diffuse");
					}
			}
 
      //删除所有的MeshCollider
			foreach(MeshCollider collider in UnityEngine.Object.FindObjectsOfType(typeof(MeshCollider)))
			{
				DestroyImmediate(collider);
			}
 
			//删除没有用的动画组件
			foreach(Animation animation in UnityEngine.Object.FindObjectsOfType(typeof(Animation)))
			{
				if(animation.clip == null)
					DestroyImmediate(animation);
			}
			foreach(Animator animator in UnityEngine.Object.FindObjectsOfType(typeof(Animator)))
			{
                                 if(animator.clip==null){
				<span style="white-space:pre">	</span>DestroyImmediate(animator);
                               }
			}
		}
		//保存
		AssetDatabase.SaveAssets();
	}

如果你的项目中美术已经上传了很多场景,并且你也不知道那个场景有问题,那就快写一个批量删除所有场景的插件吧。

结合上面的代码

	[MenuItem("Tools/批量删除所有场景中的MeshCollider 和Animation")]
	static public void RemoveAll()
	{
		//遍历所有场景
		foreach (UnityEditor.EditorBuildSettingsScene scene in UnityEditor.EditorBuildSettings.scenes)
		{
		  //当场景启动中
			if (scene.enabled)
			{
			 //打开这个场景
				EditorApplication.OpenScene(scene.path);
				//删除该场景中的所有MeshCollider 和Animation
				Remove();
			}
		}
		//保存
		EditorApplication.SaveScene();
	}

另外清注意 只有你的场景在BuildSettings页面中注册过UnityEditor.EditorBuildSettings.scenes才能获取场景。如果你的场景没有加到BuildSetting中。可以使用以下代码:

using UnityEngine;
using System.Collections;
using UnityEditor;
using System.Collections.Generic;
using System.IO;
public class Easy : Editor {
 
	[MenuItem("Tools/同步所有场景到SceneSetting文件")]
	static void CheckSceneSetting()
	{
		List<string> dirs = new List<string>();
		GetDirs(Application.dataPath,ref dirs);
		EditorBuildSettingsScene[] newSettings = new EditorBuildSettingsScene[dirs.Count];
		for(int i =0; i< newSettings.Length;i++)
		{
			newSettings[i] = new EditorBuildSettingsScene(dirs[i],true);
		}
		EditorBuildSettings.scenes = newSettings;
		EditorApplication.SaveAssets();
	}
	private static void GetDirs(string dirPath, ref List<string> dirs)
	{
		foreach (string path in Directory.GetFiles(dirPath))
		{
			if(System.IO.Path.GetExtension(path) == ".unity") 
			{
				dirs.Add(path.Substring(path.IndexOf("Assets/")));
			}
		}
		if (Directory.GetDirectories(dirPath).Length > 0)
		{
			foreach (string path in Directory.GetDirectories(dirPath))
				GetDirs(path,ref dirs);
		}
	}
}
合并drallCall 最简单的办法就是让美术上传模型的时候勾选一下Static,这样Unity会自动帮我们合并DrawCall.我建议你还是不要相信美术了。帮他们做工具吧。。

或者你也可以在游戏运行中动态的添加,找一个合适的位置写入如下代码。他会把该游戏对象以及所有子对象全部合并DrawCall。

StaticBatchingUtility.Combine(gameObject);

这样合并DrawCall的很方便,而且也很简单。但是无法修改所有子对象的坐标、旋转、缩放了,但是可以修改父对象。如下图所示,比如我给a 设置了static属性,或者 Combine(a.gameObject) ,那么如果代码中你需要操作b 或者 c 的Transform那么是不行的, 但是你可以操作a。 他会带着 b 和c 一起Transform。



【转载自】雨松MOMO 2014年05月04日 于 雨松MOMO程序研究院 

发表本文固定链接: http://www.xuanyusong.com/archives/2564


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Unity开发优化----删除多余的MeshCollider和Animation组件 的相关文章

  • unity 五种旋转方式localEulerAngles、eulerAngles、rotation、localRotation和Rotate的区别

    1 1 transform localEulerAngles 使用localEulerAngles进行旋转的时候 我们要使用transform localEulerAngles new Vector3 x y z 其中 new Vector
  • Unity的C#编程教程_59_字典 Dictionary 详解及应用练习

    文章目录 C Dictionary Introduction C Dictionary Looping through Dictionary C Dictionary When to Use C Dictionary Using Dicti
  • Unity UGUI的RawImage(原始图片)组件的介绍及使用

    Unity UGUI的RawImage 原始图片 组件的介绍及使用 1 什么是RawImage组件 RawImage是Unity UGUI中的一个组件 用于显示原始图片 与Image组件不同 RawImage可以直接显示原始图片的像素数据
  • VS2017调试unity没有解决方案

    1 VS2017之前的版本调试unity 需要下载 Visual Studio Tools for Unity 2 VS2017内置了Visual Studio Tools for Unity 3 首先打开 帮助 gt 关于 已安装程序中查
  • unity3D期末作业捕鱼游戏,适合初学者学习使用,包含源程序所有文件

    虚拟现实期末作业捕鱼游戏 免积分下载 点我下载资源 有按钮 背景音乐 可以发射炮弹捕鱼 可以选择难度 可以调节音乐声音大小 有游戏加载进度条 详细情况请看如下动态图 点我下载资源
  • Unity动画机制 Animator与Animator Controller教程

    Chinar blog www chinar xin Unity动画机制 Animator Animation 本文提供全流程 中文翻译 Chinar 的初衷是将一种简单的生活方式带给世人 使有限时间 具备无限可能 Chinar 心分享 心
  • URP——后期处理特效

    通用渲染管道 URP 包括一个后处理效果的集成实现 如果使用URP 则不需要为后期处理效果安装额外的包 URP与Post Processing Stack v2包不兼容 URP使用体积框架进行后期处理效果 下面的图片显示了一个URP场景有没
  • Unity中的单元测试

    我知道的单元测试有两种方法 1 从Unity的AssetStore窗口下载UnityTestTools 已下架了 2 使用TestRuner 2018 2 5以上版本有 我用的是2018 2 7 TestRuner的用法 操作窗口 Wind
  • untiy的纹理格式介绍

    Desktop RGB Compressed DXT1 压缩的RGB纹理 这是最常见的漫反射纹理格式 4位 像素 32 KB 256x256 RGBA Compressed DXT5 压缩的RGBA纹理 这是漫反射和高光控制纹理的主要格式
  • 也想做一个绝地求生版的汽车控制移动,进来瞧瞧?(干货满满)

    控制车子移动 效果图附上 1 首先4个车轮复制一遍为车轮2备用 2 给车轮2全部添加wheel collider 只剩下车轮碰撞器和transform组件 3 给原版4个车轮添加脚本wheel 变量共有 面板赋值 依次添加车轮2里面的车轮c
  • Unity编辑器扩展——进度条显示通用方法

    在我们使用Unity编辑器扩展做一些批处理的工具时 通常会需要显示一个进度条 这样不会让Unity一直卡住不动 使得使用者不知道当前的进展 那么如何显示进度条呢 涉及的相关API有 EditorUtility ClearProgressBa
  • JPush极光推送Unity插件iOS设备无法获取DeviceToken

    前言 最近在使用JPush进行极光推送 Unity插件GitHub地址https github com jpush jpush unity3d plugin 问题描述 但是发现了一个问题 按照官方文档操作 最终仍然无法获取DeviceTok
  • Unity 音频卡顿 静帧 等待等问题的解决方案

    是否遇到过在Unity中加载音频文件卡顿 也就是画面卡住 的现象 特别是加载外部音频文件时 虽然时间很短 但这终归不是什么好现象 尤其是打游戏的话 影响很大 但是一些有牌面的Boss也不能不配音乐 当然也可以通过其它方式解决 比如特定条件统
  • Unity_如何使相机视角一直跟随角色移动

    实例代码如下 using System Collections using System Collections Generic using UnityEngine 相机视角跟踪 public class FollowTarget Mono
  • [3dsMax]2018版下拉菜单项的子菜单无法选中

    软件自身问题 安装更新补丁即可解决 不想更新补丁也可以使用键盘的方向键进行选中 补丁百度云链接 https pan baidu com s 1LDxRFwQnR0GSONuz7wcEfA 提取码 6gpk
  • Unity3D:按键生成物件,Instantia…

    在按下按键之后 可以在画面中生成之前定义好了的物体 这里使用了Instantiate函数来生成 1 先在游戏中定一个空物件GameObject 创建空物件快捷键 ctrl shift n 2 在视图中放置 3 编写脚本 脚本 SpaceCh
  • Unity打包WebGL的优化常用操作?

    1 贴图部分优化 如果贴图格式时2048 在不影响画面效果的情况下 改成1024或者5 12 还可以缩小包体 2 压缩和解压缩问题 WebGL打包的时候分三种压缩情况 gzip 比Brotli文件打 但打包快 http和https都支持 B
  • Mecanim Any State

    Any State表示任意状态 任意状态是 一个一直存在的特殊状态 他的存在是为了保证你在无意转移至某个你当前正处于的特殊状态而准备的 为你的状态机中的每个状态设置相同的对外转移是一个快捷的方式 假如有Walk Run Fly Die这四个
  • NO.6——Unity3D中两种绘制小地图的方法

    在玩游戏时 你经常会发现 在游戏窗口的右上角或者左下角通常会有一个小地图 里边实时反馈角色的移动信息甚至是世界地图 那么这个小地图是如何绘制的呢 我目前掌握了两种方法 一种是以GUI方法重新绘制一个小窗口 另一种是新建一个正交投影的摄像机机
  • Unity2D:缩放游戏对象而不缩放其子对象

    我有一个敌人 里面有孩子 敌人也有死亡动画 在死亡动画中 使用动画师 我将敌人缩放到适当的大小 然而 敌人内部的孩子也被缩小 即使我在孩子上有一个动画 我已经调整了它的大小 我还在这个孩子上添加了锚点位置 有没有办法既能缩小敌人的规模 又能

随机推荐

  • c++字符串倒序

    include
  • PostgreSQL 分组集合新功能(GROUPING SETS,CUBE,ROLLUP)

    PostgreSQL 分组集合新功能 GROUPING SETS CUBE ROLLUP 实验环境 操作系统 windows 10 家庭中文版 数据库系统 PostgreSQL 9 6 2 说明 postgresql从9 5版本开始新加入了
  • 计算机视觉中的“x模型全系列大解析(Neck篇)”,探讨图像处理技术

    计算机视觉中的 x模型全系列大解析 Neck篇 探讨图像处理技术 计算机视觉中 许多任务需要使用卷积神经网络 CNNs 来处理图像数据 其中一种常见的架构是x模型 该模型由许多组卷积层和池化层组成 并以一个全局平均池化层结束 在这篇文章中
  • 系统测试(重点知识)

    软件的生命周期 计划 分析 设计 编码 测试 运维 软件的研发模型 1 大爆炸模型 开发人员不遵循任何特定过程 从资金投入开始 到检查是否与客户要求一致结束 2 边写边改模型 根据用户的需求 完成一个版本后 再根据用户的修改意见 继续发布新
  • 通用组、全局组、本地域组的区别

    1 本地域组 多域用户访问单域资源 访问同一个域 本地域组的成员可包括Windows Server2003 Windows 2000或WindowsNT域中的其他组和账户 而且只能在其所在域内指派权限 2 全局组 单域用户访问多域资源 必须
  • POSIX Vs System V

    POSIX Vs System V 分类 unix linux 2007 11 19 11 46 184人阅读 评论 0 收藏 举报 看 UNIX网络编程卷二 IPC 基本是前一章介绍POSIX 后一章就介绍 System V 没有好好看各
  • VMware Site Recovery Manager-SRM部署

    VMware Site Recovery Manager 是一款与底层复制技术集成的自动化软件 可提供 基于策略的管理 无中断测试和自动化的恢复计划编排 它专为虚拟机而设计 而且可以 扩展以管理 VMwarevSphere 环境中的所有应用
  • CSS3 媒体查询

    1 什么是媒体查询 CSS3媒体查询 Media Query 语法的特性 使用 media 查询 可以针对不同的媒体类型定义不同的样式 media 可以针对不同的屏幕尺寸设置不同的样式 当你重置浏览器大小的过程中 页面也会根据浏览器的宽度和
  • 局部变量,全局变量与内存

    本文会使用IDA分析局部变量 全局变量在内存的存储 目录 使用IDA分析局部变量 使用IDA分析全局变量 总结 使用IDA分析局部变量 include
  • JavaScript -- Set数据结构

    文章目录 什么是Set Set实例的属性和方法 add has delete clear forEach size属性 Set构造函数 数组 字符串 arguments DOM Set 注意事项 判断重复的方式 Set应用 Set转数组 数
  • flask 导入一个模板

    from flask import Flask redirect url for render template app Flask name app route def index return render template login
  • neo4j图数据入门(二)数据的插入和删除 图形界面操作 图文并茂

    点击下图中的按钮 点击下图中按钮 上图中的代码 CREATE p1 Person name 胡兴炯 born 1991 interest mac ios 旅游 goodat java swift objectiveC p2 Person n
  • Java - 多态之向上转型与向下转型

    Java 多态之向上转型与向下转型 代码示例 父类 public class Father int f 100 public void name System out println father public void tel Syste
  • Premiere Pro 2022 for Mac(pr2022)中文版

    Mac版Premiere Pro 2022更新了 最新版的pr2022不仅可以帮助用户对各种视频进行剪辑 旋转 分割 合并 字幕添加 背景音乐等基础的处理 还能帮助用户进行视频颜色校正 颜色分级 稳定镜头 调整层 更改片段的持续时间和速度
  • hover调试小技巧(无需修改代码)

    某块内容是hover后才能显示的 但此时我们想要调试hover态的时候 通常的办法是以下几种 改代码 修改代码让它默认处于hover态 但是这样麻烦不说 还只应用于本地环境 每次改代码都需要进行热更新 用Chrome开发工具让DOM处于ho
  • cache write back

    1 问题阐述 在ITE的SDK上编译 选择了CPU write back cache enable CPU WB 之后 显示画面总是出现有错乱 通过设置断点 发现当停在解析的数据后 在运行就不会出现错乱现象 问了大神才知道 只是cache没
  • qt开发的程序 为何一个主窗口关闭了,程序不退出,而是到等到所有窗口关闭了,才退出呢?

    这种行为是由Qt框架中的事件循环 Event Loop 机制引起的 Qt应用程序在执行时 会进入一个事件循环 该循环负责处理用户输入 事件和信号 并相应地调用相应的槽函数或处理程序 当你关闭一个Qt应用程序的主窗口时 主窗口会发出一个关闭事
  • 二进制模2除法(CRC校验)

    二进制模2除法与二进制除法不同 模2运算 加法不进位 减法不借位 二进制除法 带借位的二进制除法 根据余数减除数够减与否 确定商1还是商0 若够减则商1 否则商0 二进制模2除法 采用模2减法 不带借位的二进制减法 因此考虑余数够减除数与否
  • 制作论文中双Y轴散点图

    import pandas as pd import matplotlib pyplot as plt from matplotlib dates import AutoDateLocator DateFormatter from date
  • Unity开发优化----删除多余的MeshCollider和Animation组件

    手游项目做碰撞的时候 有关一切物理的东西Unity对手机支持的并不好 多余的MeshCollider 和Animation 空的组件 这俩东西很占效率的 比如下图这样的组件 还有场景的材质最好用Mobile Diffuse 它会比Diffu