unity3d 刚体 掉下去中如何去除掉一个GameObject的MeshRenderer

&Unity3D&Unity3D中MeshRenderer的使用
我的图书馆
&Unity3D&Unity3D中MeshRenderer的使用
任何一个模型都是由许多网格面组成的,而面又是由许多三角形组成的。
操作环境:Win7操作系统、Unity3D 4.0
创建网格面的核心就是为其添加2个组件:Mesh Renderer(网格渲染器)和Mesh Filter(网格过滤器)。
添加组件的方法有2种:
(Ⅰ)选择一个游戏对象,然后执行Component→Mesh→Mesh Filter 和Mesh Renderer。
(Ⅱ)通过脚本实现:
【理论分析】
由于网格面是由三角形组成的,所以我们有必要知道三角的三个顶点的位置。数组mesh.vertices就是用于存储三角形顶点坐标。
当顶点数超过3个的时候,我们连接点的顺序不同,就会绘制出不同形状的图形,所以我们必须要获得我们想要的连接点的顺序。数组mesh.triangles就是用来记录连接三角形的顺序的。由于每绘制一个三角形需要知道其三个顶点的顺序,那么绘制n个三角形就需要知道3*n个点的顺序。即数组mesh.triangles的长度是3的倍数。
如上图,如果我们已知顶点的坐标和顺序如上,怎样绘制出这样的图形?
已知5个点,选择3个点来连接,将其全部连接完有很多种方式,这里我就不计算了~嘻嘻嘻。但是不是每一种方式都能连接成上面的图形的。例如:(0,1,2),(1,2,3),(2,3,4)就无法完成上面的图形。所以我们必须要获得三角形顶点的索引顺序。完成上面图形我采用的顺序:(0,1,2),(0,2,3),(0,3,4)。大家也可以使用其他的顺序。那么我的mesh.triangles=new int[]{0,1,2,0,2,3,0,3,4};而mesh.vertices的值就是点的坐标了。
&【案例】拖动鼠标来绘制一个圆弧
【效果图】
TA的最新馆藏
喜欢该文的人也喜欢博主最新文章
博主热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)程序写累了,就来玩玩酷跑小游戏吧,嘿嘿。
雨松MOMO送你一首歌曲,嘿嘿。
Unity3D研究院之利用unity自带API提前合并场景Mesh
Unity3D研究院之利用unity自带API提前合并场景Mesh
围观24578次
编辑日期: 字体:
版本:Unity5.3.3
Unity自带了合并Mesh的功能,最简单的做法就是在Root节点勾选static选项,它的原理就是运行时合并。但是最近我在开发的时候就遇到了问题,因为我们场景非常庞大,Mesh的顶点不能超65535所以Unity会自动把合并的mesh分成了很多分mesh,总之顶点都小于65535。
在IOS上测试都是正常的,可是在有些Android机器是场景就出问题了。就是渲染不正确,所以得到的结论就是不能完全依赖Unity的合并Mesh功能。再说Mesh合并的太大一样会带来性能的影响。所以我就在想能不能有策略性的合并Mesh.答案肯定是可行的,比如我根据gameObject的位置找出50米之内的MeshRender然后进行合并。如果是运行时合并,为了避免大量查找所带来的性能消耗,可以在Editor下提前把需要合并的mesh序列化在场景里。 在场景加载的Awake里进行合并。
我在说说另一种生成文件的方式。今天我想说的就是把有些mesh提前合并成.asset文件,直接写在unity工程里。网上我找到了一些别的文章,但都是要生成一个全新的大mesh,然后把之前的小mesh全都隐藏了。我感觉没有unity原有的方式好,因为假如原有的gameObject上挂了一些脚本, 这样一隐藏脚本也就失去了某些意义。。而且还不能单独的显示/隐藏某一个特定的mesh。
如下图所示,美术把所有的mesh都放在了Root节点下面。每一个MeshFilter都应该是美术自己创建的FBX里的。
我现在想做的就是,把某些MeshFilter合并,生成一个新的Mesh,并且要直接修改在原有的MeshFilter上的mesh。如下图所示,最终的结果。
为了避免重名我会根据当前场景的路径在平级目录下生成一个文件夹,把生成的mesh文件放进去。并且替换原有meshFilter上的mesh文件。
下面是我的代码。
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
using UnityEngine;using System.Collections;using UnityEditor;using UnityEditor.SceneManagement;using System.IO;&public class CreateMesh&&{& [MenuItem("Tools/create")] static void Start1 ()
GameObject root = GameObject.Find("Root");&
MeshRenderer [] meshRenderers = root.GetComponentsInChildren&MeshRenderer&();&
GameObject [] gos = new GameObject[meshRenderers.Length];
for(int i = 0; i& meshRenderers.Length;i++)
gos[i] =meshRenderers[i].gameObject;
string scenePath = EditorSceneManager.GetSceneAt(0).path;
string meshScenePath = scenePath.Replace(".unity","_mesh");
string fullPath = Path.Combine(Directory.GetCurrentDirectory(),meshScenePath);&
if(Directory.Exists(fullPath))
Directory.Delete(fullPath,true);
Directory.CreateDirectory(fullPath);
string assetPath = FileUtil.GetProjectRelativePath(fullPath);&
StaticBatchingUtility.Combine(gos,root);
for(int i =0; i& gos.Length; i++)
Mesh mesh = gos[i].GetComponent&MeshFilter&().sharedMesh;
string meshPath = AssetDatabase.GetAssetPath(mesh);&
if(string.IsNullOrEmpty(meshPath))
string path = Path.Combine(assetPath,Random.Range(int.MinValue,int.MaxValue) +".asset");
AssetDatabase.CreateAsset(mesh,path);
AssetDatabase.Refresh();
EditorSceneManager.MarkAllScenesDirty(); }}
StaticBatchingUtility.Combine 这方法有两个重载
1.参数root节点。这样使用起来就有点限制了, 因为美术就得提前放需要合并的mesh放在一个规定的节点下。假如我想把一个节点合并成多个 mesh就不行了。
2.参数是 数组 和一个顶层节点。 这个用起来就方便多了。我可以把我需要合并的gameObject放在一个数组里,然后给他们指定一个节点就行了。(指定在地图的顶层节点上就行了)
最后欢迎大家一起讨论。 目前我还是在 运行时合并 和 提前合并 中拿捏不定!!
本文固定链接:
转载请注明:
雨松MOMO提醒您:亲,如果您觉得本文不错,快快将这篇文章分享出去吧 。另外请点击网站顶部彩色广告或者捐赠支持本站发展,谢谢!
作者:雨松MOMO
专注移动互联网,Unity3D游戏开发
如果您愿意花10块钱请我喝一杯咖啡的话,请用手机扫描二维码即可通过支付宝直接向我捐款哦。
您可能还会对这些文章感兴趣!博主最新文章
博主热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)

我要回帖

更多关于 unity3d去除天空盒子 的文章

 

随机推荐