Optimize script or Other way get material name (js)

Hi all.

I wrote this script, so this script can get material name hiting by ray but need something easiest or optimize this.

What can optimize here?

Here is script :

//Thanks to Bunny83 for help

var transf : Transform;

class hitmat1 {
	var enabled : boolean = true;
	var texturehit : String;
	@HideInInspector
	var tranglind : int;
	@HideInInspector
	var Layer : LayerMask = 1;
}

var hitmat1 : hitmat1 = hitmat1();

function Update() {
	var hit : RaycastHit;
	if (Physics.Raycast(transf.position, transf.TransformDirection(Vector3.forward), hit, 2, hitmat1.Layer)) {
		ind = hit.triangleIndex;
		if (hitmat1.tranglind != ind && hitmat1.enabled) {
			hitmat1.tranglind = ind;
			var go1 = hit.collider.gameObject;
			var mee = go1.GetComponent(MeshFilter).mesh;
			var mre = go1.GetComponent(MeshRenderer);
			if (mee && mre) {
				if (go1.renderer.materials.Length > 1) {
					for (var submesh = 0; submesh < mee.subMeshCount; submesh++) {
						var indices = mee.GetTriangles(submesh);
						for (var i = 0; i < indices.Length; i += 3) {
							if (mee.vertices[indices_] == mee.vertices[mee.triangles[ind * 3]] && mee.vertices[indices[i + 1]] == mee.vertices[mee.triangles[ind * 3 + 1]] && mee.vertices[indices[i + 2]] == mee.vertices[mee.triangles[ind * 3 + 2]]) {_
  •  						hitmat1.texturehit = mre.materials[submesh].name.ToLower();*
    
  •  						i = indices.Length;*
    
  •  						submesh = mee.subMeshCount;*
    
  •  						}else{*
    
  •  							hitmat1.texturehit = "Null";*
    
  •  					}*
    
  •  				}*
    
  •  			}*
    
  •  			}else{*
    
  •  				mtexx = go1.renderer.material.mainTexture;*
    
  •  				if (mtexx)*
    
  •  					hitmat1.texturehit = mtexx.name.ToLower();*
    
  •  					else*
    
  •  					hitmat1.texturehit = "Null";*
    
  •  		}*
    
  •  	}*
    
  •  }*
    
  • }*
    }

Generic advice

Things like mee.vertices and mee.triangles will perform a copy of vertices and triangles every time you call them, so move them out of the loop:

// before the loop
var triangles = mee.triangles;

and then use triangles instead of mee.triangles.

Special tricks

Unity internally doesn’t keep a list triangles for each submesh, it only keeps a startIndex+endIndex which are indices into Mesh.triangles array. Unfortunately Unity doesn’t give you startIndex+endIndex, but in theory you could precalculate them yourself. Then once you have finding the material would be piece of cake, something like this:

if (hit.triangleIndex >= startIndex && hit.triangleIndex <= endIndex)

Now working faster :

Here is script :

var transf : Transform;

class hitmat1 {
 var enabled : boolean = true;
 var texturehit : String;
 @HideInInspector
 var tranglind : int;
 @HideInInspector
 var Layer : LayerMask = 1;
}

var hitmat1 : hitmat1 = hitmat1();

function Update() {
 var hit : RaycastHit;
 if (Physics.Raycast(transf.position, transf.TransformDirection(Vector3.forward), hit, 2, hitmat1.Layer)) {
 ind = hit.triangleIndex;
 if (hitmat1.tranglind != ind && hitmat1.enabled) {
 hitmat1.tranglind = ind;
 var go1 = hit.collider.gameObject;
 var mee = go1.GetComponent(MeshFilter).mesh;
 var mre = go1.GetComponent(MeshRenderer);
 if (mee && mre) {
 if (go1.renderer.materials.Length > 1) {
 var triangles = mee.triangles;
 for (var submesh = 0; submesh < mee.subMeshCount; submesh++) {
 var indices = mee.GetTriangles(submesh);
 for (var i = 0; i < indices.Length; i += 3) {
 if (indices _== triangles[ind * 3] && indices[i + 1] == triangles[ind * 3 + 1] && indices[i + 2] == triangles[ind * 3 + 2]) {_

hitmat1.texturehit = mre.materials[submesh].mainTexture.name.ToLower();
i = indices.Length;
submesh = mee.subMeshCount;
}else{
hitmat1.texturehit = “Null”;
}
}
}
}else{
mtexx = go1.renderer.material.mainTexture;
if (mtexx)
hitmat1.texturehit = mtexx.name.ToLower();
else
hitmat1.texturehit = “Null”;
}
}
}
}
}