- Home /
How to hide just one mesh (meshfilter) from a gameObject that has 2 meshes?
We already know that it's possible to hide or deactivate a mesh using:
GetComponent(MeshRenderer).enabled = false;
but, what if the gameObject has 2 or more meshes and we want to just hide one of them? Imagine this structure: gameObject mesh1 mesh2 mesh3
How to access mesh2 and deactivate it?
Thanks
Answer by Kiyaku · Nov 19, 2009 at 11:48 PM
Well i think it is not even possible to use more than one MeshRenderer on the same object, same for MeshFilter.
And i think i never see more than one mesh applied to a MeshFilter on any model of mine. If i have several meshes in one Model, it will be seperated into Parents. Then you can just hide the parents if you need to.
For example if you want to make an MMO and customize your model, you could include all kind of jackets into one model. If you then want to display only the "naked" version, just make the parent "naked" visible and everything else invisible (like "robe", "t-shirt", whatever) (just an example, there are probably better solutions).
If this doesn't help, maybe it would help to know what exactly you want to do.
EDIT:
You could use a function lide to to show only the mesh you enter in the "showExcept":
void Start () { showExcept("mesh1"); }
void showExcept(string meshName) { foreach(Transform temp in transform) { if(temp.name == meshName) temp.renderer.enabled = true; else temp.renderer.enabled = false; } }
So in this case, only "mesh1" will be displayed, everything else will be invisible. you could write several function (to activate only one mesh without deactivating the others, activate everything except one, etc).
Your example could work for me, but my problem is that I don't know how to code it... So, for example, with the hierarchy I proposed (house/mesh1) how can I deactivate "mesh1" without deactivating "house"? Thanks
Answer by eXKR · Nov 23, 2009 at 07:49 AM
I finally got what I wanted:
// This script is made to be applied to an unique gameObject that has 3 different meshes called HLOD, MLOD and LLOD that will correspond with its different versions.
var distance1 = 5.0; //Jump from HLOD to MLOD var distance2 = 10.0; //Jump from MLOD to LLOD private var HLOD : Transform; private var MLOD : Transform; private var LLOD : Transform;
function Start() { HLOD = transform.Find("HLOD"); MLOD = transform.Find("MLOD"); LLOD = transform.Find("LLOD"); } function Update () { //The camera should have applied "MainCamera" tag in order to correctly switch LODs var campos = Camera.main.transform.position;
if ((transform.position - campos).sqrMagnitude < distance1 * distance1 )
{
// use High LOD
HLOD.active = true;
MLOD.active = false;
LLOD.active = false;
}
else if ((transform.position - campos).sqrMagnitude < distance2 * distance2) { // use Medium LOD HLOD.active = false; MLOD.active = true; LLOD.active = false; } else { // use Low LOD HLOD.active = false; MLOD.active = false; LLOD.active = true; } }
This code worked like a charm for me. Thank you very much for your help.
Answer by Lucas Meijer 1 · Nov 20, 2009 at 08:30 AM
If they have different materials, you could change the material to not render anything, however it seems it would make a lot more sense to actually use three gameobjects if you need to do this.