多余的MeshCollider和Animation

如果你是在做手游项目,我强烈建立不要做碰撞,有关一切物理的东西unity对手机支持的并不好,如果不信你可以试试效率你就知道。美术兄弟,每次给过来的场景,都会带上MeshCollider 和Animation 空的组件。这俩东西很占效率的,不信你可以用Profiler 看看。如果你让美工们上传场景的时候手动检查一下,把MeshCollider和Animation空的组件都删掉,我可以很负责的告诉你,他们肯定会忘删除或者错删。。。比如下图这样的组件。

<ignore_js_op>

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

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

[AppleScript] 纯文本查看 复制代码

?


01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

  [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();

                            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);

                  }

//应该没有人用Animator吧? 避免美术弄错我都全部删除了。

                  foreach(Animator animator in UnityEngine.Object.FindObjectsOfType(typeof(Animator)))

                  {

                                  DestroyImmediate(animator);

                  }

          }

          //保存

          AssetDatabase.SaveAssets();

  }

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

[AppleScript] 纯文本查看 复制代码

?


01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

18

[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中。 如果想批量添加你可以参考我之前写的文章我还是copy过来吧。

[AppleScript] 纯文本查看 复制代码

?


01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

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 dirs = new List();

                GetDirs(Application.dataPath,ref dirs);

                EditorBuildSettingsScene[] newSettings = new EditorBuildSettingsScene[dirs.Count];

                for(int i =0; i< newSettings.Length;i++)

                {

                        newSettings = new EditorBuildSettingsScene(dirs,true);

                }

                EditorBuildSettings.scenes = newSettings;

                EditorApplication.SaveAssets();

        }

        private static void GetDirs(string dirPath, ref List 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。

[AppleScript] 纯文本查看 复制代码

?


1

StaticBatchingUtility.Combine(gameObject);

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

嘿嘿,美术处理这些东西真是。“美工靠得住,母猪会上树” 嘿嘿嘿嘿。 不过不要紧,亲爱的美术,我们程序会想办法帮你们检查错误的, 嘿嘿嘿嘿。

时间: 2024-10-06 03:30:07

多余的MeshCollider和Animation的相关文章

iOS中Animation 动画 UI_22

1.iOS中我们能看到的控件都是UIView的子类,比如UIButton UILabel UITextField UIImageView等等 2.UIView能够在屏幕的显示是因为在创建它的时候内部自动添加一个CALayer图层,通过这个图层在屏幕上显示的时候会调用一个drawRect: 的方法,完成绘图,才能在屏幕上显示 3.CALayer 本身就具有显示功能,但是它不能响应用户的交互事件,如果只是单纯的显示一个图形,此时你可以使用CALayer创建或者是使用UIView创建,但是如果这个图形

Unity3D游戏开发之详解 Animation类和Animator类

Unity3D游戏开发之详解 Animation类和Animator类 Animation类 animation组件用于播放动画.可以指定动画剪辑到动画组件并从脚本控制动画播放.在Unity的动画系统基于权重并且支持动画融合,叠加动画,动画混合,标签和完全控制动画播放的各个方面. 如果想播放一个简单的动画,可以使用Animation.Play:如果想在动画之间交叉淡入,可以使用Animation.CrossFade:如果想改变动画模式(循环,一次,乒乓),可以改变动画导入设置里面的动画帧的Wra

深入理解CSS动画animation

× 目录 [1]定义 [2]关键帧 [3]动画属性 [4]多值 [5]API 前面的话 transition过渡是通过初始和结束两个状态之间的平滑过渡实现简单动画的:而animation则是通过关键帧@keyframes来实现更为复杂的动画效果.本文将介绍关于animation动画的相关知识 定义 和transition类似,animation也是一个复合属性,包括animation-name.animation-duration.animation-timing-function.animat

iOS - Animation 八种方法

一.//UIView动画 //能够做动画的属性, feame, center, bounds, alpha, transfom, backgroundcolor //iOS4.0 之前如果想做动画, 必须放在开始可提交之前才有效 //对属性更改值是有效值, 最终会对视图作出修改 //开始动画 [UIView beginAnimations:nil context:nil]; //1.设置动画持续的时间 --- 单位 秒 [UIView setAnimationDuration:2]; //2.设

iOS Core Animation Advanced Techniques(七):高效绘图、图像IO以及图层性能

高效绘图不必要的效率考虑往往是性能问题的万恶之源. ——William Allan Wulf 在第12章『速度的曲率』我们学习如何用Instruments来诊断Core Animation性能问题.在构建一个iOS app的时候会遇到很多潜在的性能陷阱,但是在本章我们将着眼于有关绘制的性能问题. 软件绘图 术语绘图通常在Core Animation的上下文中指代软件绘图(意即:不由GPU协助的绘图).在iOS中,软件绘图通常是由Core Graphics框架完成来完成.但是,在一些必要的情况下,

iOS——Core Animation 知识摘抄(四)

原文地址http://www.cocoachina.com/ios/20150106/10840.html 延迟解压 一旦图片文件被加载就必须要进行解码,解码过程是一个相当复杂的任务,需要消耗非常长的时间.解码后的图片将同样使用相当大的内存. 用于加载的CPU时间相对于解码来说根据图片格式而不同.对于PNG图片来说,加载会比JPEG更长,因为文件可能更大,但是解码会相对较快,而且Xcode会把PNG图片进行解码优化之后引入工程.JPEG图片更小,加载更快,但是解压的步骤要消耗更长的时间,因为JP

今日提及之动画animation

今天没有说什么内容,只是对HTML5的细节补充,如HTML结构的可以省略到最大的地步 <!DOCTYPE html><meta charset="UTF-8"> <title>animation</title> 这里是放内容的 没有了基本的结构标签了,浏览器会自动帮我们生成. 还有标签的属性的双引号也可以省略: <input type=text> HTML5让我体验到它在最大化的简化标签,使代码量最小化. 还有调试工具的使用,

css3 动画(animation)-简单入门

css3之动画(animation) css3中我们可以使用动画,由于取代以前的gif图片,flash动画,以及部分javascript代码(相信有很多同学都用过jquery中的animate方法来做一些动画).具体如何使用呢??? 首先定义一个动画,然后引用动画. 定义一个动画要使用@keyframes,然后跟上你要定义的动画的名字.关键字"from"表示开始, "to"表示结束,等同于0% 和 100%.最好使用百分比来表示变化发生的时间,这样的话还可以定义从开

IOS Animation-CAShapeLayer、UIBezierPath与Animation的结合

在阅读本文之前,对CAShapeLayer.UIBezierPath不熟悉的话,可以先阅读文章 贝塞尔曲线与Layer 如果对动画不熟悉的话,先阅读文章 动画基础.深入 Layer是绘图的画板,Bezier是画图的画笔,Animation是画图的动作.现在我们可以通过下面例子更好的让它们更好地结合在一起. 1)画一个小屋子动画 我们首先通过定义CAShapeLayer画板,然后定义path来确定画图路径.最后使用动画.如下面代码 1 //让一个屋子的线画起来的动画效果 2 func addCAS