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的C#编程教程_52_类 Class 详解及应用练习(一)

    文章目录 C Classes for Behaviours Custom Classes 1 Custom Classes 2 Serialized Custom Class RPG Item Database Example 3 When
  • Unity InputSystem 实现同一按键单击、双击、长按执行不同逻辑

    最近学习了一下Unity InputSystem 该系统可用于实现 管理复杂的操作逻辑 上限很高 但由于它有一定的学习成本 导致一些和我一样的小白一入门时不得要领 之前卡住我的一个需求就是通过InputSystem 实现同一按键单击 双击
  • Unity3d 简单的按照路径移动物体!

    在TORQUE引擎中 我们只要设置几个点 然后物体会按照这几个点顺序移动 Unity3d也可以的 现在介绍一个很简单的按照路径移动的方法 目标是让蓝色方块沿着紫色方块组成的路径移动 设计思想就是让蓝色方块移动第一个 然后继续移动到第二个 然
  • unity中通过touch旋转、放大和缩小物体以及滑动方向的判断

    unity中通过touch旋转 放大和缩小物体以及滑动方向的判断这个需求在游戏开发中也是非常频繁 话不多说直接上代码 using System Collections using System Collections Generic usi
  • Unity3D中通过代码修改子物体层级的顺序

    今天有个同事问我如何在程序中修改子物体的层级关系来改变遮挡关系 我给他敲出来一句代码 UI的层级关系是通过渲染表现出来的 在canvas下的物体 排序越靠前的越先被渲染 这样一来就会 被后来渲染的遮挡 总结一下有三句代码是修改子物体的层级的
  • 《Unity Shader入门精要》彩图版免费分享~~~~~

    这书很多地方都要币或者要钱 这里就免费分享了 下面是网盘链接 顺手点个赞或者评论一波呗 下载链接 链接 https pan baidu com s 137Y1nkB6h8HIvKOfwFPnbQ 提取码 f8dw 顺手点个赞 蟹蟹蟹蟹
  • 离散仿真引擎基础作业与练习

    作业内容 一 简答题 1 解释 GameObjects 和 Assets 的区别与联系 2 下载几个游戏案例 分别总结资源 对象组织的结构 3 使用 debug 验证 MonoBehaviour 基本行为或事件触发条件 4 了解 GameO
  • 我的和unity3d的小故事1——恶魔射手之鼠标控制移动之input.getaxis("Horizontal")与input.getaxis("Vertical")

    跟着恶魔射手视频学习的过程中遇到的第一个问题是怎么也移动不了 那么问题来了 打印出来是获得的下面两个值都是0 怎么办呢 改edit下面的projectsetting里面的input属性下面两个值的type都改成mouse movement
  • Unity3d提升效率的高级技巧(二)

    11 在层次视图中选中某个游戏对象 按快捷键 Cmd Ctrl D 即可复制该对象 对于检视面板中的数组字段也可已同样的方式来复制元素 12 检视面板中所有的颜色字段都是支持复制和粘贴的 只需右键点击颜色字段既可选择操作 13 如果觉得在场
  • HLSL 偏导数 ddx / ddy

    HLSL ddx ddy 在光栅化的时刻 GPUs会在同一时刻并行运行很多Fragment Shader 但是并不是一个pixel一个pixel去执行的 而是将其组织在2x2的一组pixels分块中 去并行执行 偏导数就正好是计算的这一块像
  • Unity笔记:修改代码执行的默认打开方式

    使用 External Tools 偏好设置可设置用于编写脚本 处理图像和进行源代码控制的外部应用程序 External Script Editor 选择 Unity 应使用哪个应用程序来打开脚本文件 Unity 会自动将正确的参数传递给内
  • 【Unity3d】Animator和Animation组件使用注意事项

    一 Animator一般用于人物动画控制 特点是动画是持续的 可能有动作切换 Animation一般用于间断性的动画的控制 比如一个场景特效的播放 只播放一次就完了 二 实测Animation速度比Animator快10 左右 内存占用没测
  • Unity使用Newtonsoft报错的解决方案

    文章目录 Unity 使用 Newtonsoft 报错的解决方案 问题描述 解决方法 方法一 使用 Unity 的 Package Manager 自动导入 方法二 访问 GitHub 下载 unitypackage 文件手动导入 Unit
  • Unity动画系统详解5:BlendTree混合树是什么?

    摘要 Animator中有一个功能 用来解决多个动画之间的混合 经常用于移动动画之间的混合 这个功能叫做BlendTree 混合树 洪流学堂 让你快人几步 你好 我是跟着大智学Unity的萌新 我叫小新 这几周一起来复 yu 习 xi 动画
  • Unity3D Engine Architecture

    原文 http www umingo de doku php id paper mechs and tanks section03 Architecture To better understand the game s software
  • Unity3D如何修改Button显示的文字以及深入了解Button组件

    在创建了一个Button后 结构如图 先仔细观察一下Button的Inspector视图 发现其中竟然有一个叫Button的脚本组件 新建脚本 代码如下 并将该脚本绑定给Canvas组件 using UnityEngine UI using
  • Unity使用spine动画

    Unity使用spine动画 在 Unity 中 常常使用 Spine 来制作一些动画 引擎本身并不能直接播放 Spine 动画 需要额外导入一个 RunTime 插件库才能支持 官网插件导入 当然 也可以到 Spine 官网关于 Unit
  • Unity3D:按键生成物件,Instantia…

    在按下按键之后 可以在画面中生成之前定义好了的物体 这里使用了Instantiate函数来生成 1 先在游戏中定一个空物件GameObject 创建空物件快捷键 ctrl shift n 2 在视图中放置 3 编写脚本 脚本 SpaceCh
  • Unity3d 插件 系列——DoTweenPro介绍(图文详细+案例)

    Unity3d 插件 系列 DoTweenPro介绍 图文详细 案例 前言 一 DoTweenPro简介 二 DoTweenPro安装 三 DoTweenPro主要组件 1 DoTweenAnimation 2 DoTweenPath 3
  • Unity3D的四种坐标系

    1 World Space 世界坐标 我们在场景中添加物体 如 Cube 他们都是以世界坐标显示在场景中的 transform position可以获得该位置坐标 2 Screen Space 屏幕坐标 以像素来定义的 以屏幕的左下角为 0

随机推荐

  • 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