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]]) {_
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)
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]) {_