Help with skidmark pooling

Well, I have a script for a skidmark that works fine and I can see the skidmarks appearing. The only problem is that it keeps instantianting and destroying the marks everytime they should appear. So, I am trying to change the code to, create all the marks at begining and then disable them. Them it should move them to the right position and enable everytime a skidmark should appear.
So, the code does not give any errors, but I don’t see any skidmark on the right position.
Does anyone know what I am doing wrong here?

Code:

using UnityEngine;
using System.Collections;

public class mySkidmarkPool : MonoBehaviour
{
	public float currentFrictionValue;    
	private float skidAt = 1.5f;    
	public GameObject skidSound;      
	private float soundEmission = 15f;   
	private float soundWait;       
	public float markWidth = 0.2f;      
	private int skidding;  
	private Vector3[] lastPost = new Vector3[2];  
	public Material skidMaterial;
	
	GameObject mark;
	int numberOfSkidMarksToCreate = 10;
	protected GameObject[] skidMarks = null;

        
        //Create a skidMesh object rssssss
	void CreateSkidMesh ()
	{
		mark = new GameObject ("Mark");    //Create new game object           
		MeshFilter filter = mark.AddComponent< MeshFilter > ();    // add a MeshFilter
		mark.AddComponent<MeshRenderer> ();       // add  a MeshRenderer
		Mesh markMesh = new Mesh ();   
		Vector3[] vertices = new Vector3[4];    // add its vertices
		int[] triangles = new int[6];     // add its triangles. rsss

		markMesh.vertices = vertices;
		markMesh.triangles = triangles;
		markMesh.RecalculateNormals ();
		
// Take care of the mesh UV
		var uvm = new Vector2[4];
		uvm [0] = new Vector2 (1, 0);
		uvm [1] = new Vector2 (0, 0);
		uvm [2] = new Vector2 (0, 1);
		uvm [3] = new Vector2 (1, 1);
		
		markMesh.uv = uvm;
		filter.mesh = markMesh;
		mark.renderer.material = skidMaterial;
//		mark.SetActive (false);
	}


        //Instantiate all the maximum skidmark objects and punt into a array.
        // and disable them.
	protected void InstantiateSkidMarks ()
	{
		CreateSkidMesh ();
		
		skidMarks = new GameObject[numberOfSkidMarksToCreate];		
		
		for (int i = 0; i < numberOfSkidMarksToCreate; i++)
		{
			skidMarks [i] = GameObject.Instantiate (mark) as GameObject;
			skidMarks [i].SetActive (false);
		}	
	}

        //Activate the skidmark
	protected void ActivateSkidMark (WheelHit hit2)
	{
		for (int i = 0; i < numberOfSkidMarksToCreate; i++)
		{
			if (skidMarks [i].activeSelf == false)
			{
                                //Get the hit from the wheelcollider
				WheelHit hit;      
				WheelCollider wheel = (WheelCollider)collider;              
				wheel.GetGroundHit (out hit);        
                                
                                //if it is the first ones, put them right under the tyres.
				if (skidding == 0)
				{            
					skidMarks [i].GetComponent< MeshFilter > ().mesh.vertices [0] = hit.point + Quaternion.Euler (transform.eulerAngles.x, transform.eulerAngles.y, transform.eulerAngles.z) * (new Vector3 (markWidth, 0.2f, 0));                     
					skidMarks [i].GetComponent< MeshFilter > ().mesh.vertices [1] = hit.point + Quaternion.Euler (transform.eulerAngles.x, transform.eulerAngles.y, transform.eulerAngles.z) * (new Vector3 (-markWidth, 0.2f, 0));                      
					skidMarks [i].GetComponent< MeshFilter > ().mesh.vertices [2] = hit.point + Quaternion.Euler (transform.eulerAngles.x, transform.eulerAngles.y, transform.eulerAngles.z) * (new Vector3 (-markWidth, 0.2f, 0));                        
					skidMarks [i].GetComponent< MeshFilter > ().mesh.vertices [3] = hit.point + Quaternion.Euler (transform.eulerAngles.x, transform.eulerAngles.y, transform.eulerAngles.z) * (new Vector3 (markWidth, 0.2f, 0));
							
					lastPost [0] = skidMarks [i].GetComponent< MeshFilter > ().mesh.vertices [2];                      
					lastPost [1] = skidMarks [i].GetComponent< MeshFilter > ().mesh.vertices [3];                       
					skidding = 1;                  
				}
				else 
				{
					skidMarks [i].GetComponent< MeshFilter > ().mesh.vertices [1] = lastPost [0];
					skidMarks [i].GetComponent< MeshFilter > ().mesh.vertices [0] = lastPost [1];
					skidMarks [i].GetComponent< MeshFilter > ().mesh.vertices [2] = hit.point + Quaternion.Euler (transform.eulerAngles.x, transform.eulerAngles.y, transform.eulerAngles.z) * (new Vector3 (-markWidth, 0.2f, 0));
					skidMarks [i].GetComponent< MeshFilter > ().mesh.vertices [3] = hit.point + Quaternion.Euler (transform.eulerAngles.x, transform.eulerAngles.y, transform.eulerAngles.z) * (new Vector3 (markWidth, 0.2f, 0));
					lastPost [0] = skidMarks [i].GetComponent< MeshFilter > ().mesh.vertices [2];
					lastPost [1] = skidMarks [i].GetComponent< MeshFilter > ().mesh.vertices [3];
				}

				skidMarks [i].GetComponent< MeshFilter > ().mesh.triangles [0] = 0;
				skidMarks [i].GetComponent< MeshFilter > ().mesh.triangles [1] = 1;
				skidMarks [i].GetComponent< MeshFilter > ().mesh.triangles [2] = 2;
				skidMarks [i].GetComponent< MeshFilter > ().mesh.triangles [3] = 2;
				skidMarks [i].GetComponent< MeshFilter > ().mesh.triangles [4] = 3;
				skidMarks [i].GetComponent< MeshFilter > ().mesh.triangles [5] = 0;

				skidMarks [i].GetComponent< MeshFilter > ().mesh.uv [0] = new Vector2 (1, 0);
				skidMarks [i].GetComponent< MeshFilter > ().mesh.uv [1] = new Vector2 (0, 0);
				skidMarks [i].GetComponent< MeshFilter > ().mesh.uv [2] = new Vector2 (0, 1);
				skidMarks [i].GetComponent< MeshFilter > ().mesh.uv [3] = new Vector2 (1, 1);					

				skidMarks [i].GetComponent< MeshFilter > ().mesh.RecalculateNormals ();
				skidMarks [i].renderer.material = skidMaterial;

				skidMarks [i].SetActive (true);				
			}
		}
	}

	void Awake ()
	{
		InstantiateSkidMarks ();
	}	
	
	void Update ()
	{
		WheelHit hit;
		WheelCollider wheel = (WheelCollider)collider;
		wheel.GetGroundHit (out hit);

		currentFrictionValue = Mathf.Abs (hit.sidewaysSlip);
		float rpm = wheel.rpm;
 
		if (skidAt <= currentFrictionValue  soundWait <= 0  hit.collider)
		{
			Instantiate (skidSound, hit.point, Quaternion.identity);
			soundWait = 1;
		}
        
		soundWait -= Time.deltaTime * soundEmission;

                //If exist a friction, activate the skidmark
		if (skidAt <= currentFrictionValue  hit.collider)
		{
			ActivateSkidMark (hit);
		}
		else
			skidding = 0;    
	}
}

No one? :frowning:

No one here uses skidmarks?

Lol don’t u just love it when people don’t respond. I can’t help with this right because I’m not at my computer. But I feel your pain. I’ve had a shader question up for days and nobody had answered me back with anything. I wish u good luck with your question.

Thank you for your answer. :slight_smile:

Anyone here using skidmarks?

You should strip down your code to the parts that are important to your question and do some comments. That way I dont need to “waste” 1 hour trying to understand your code. This is the problem why nobody is answering your question.

Well, I did add a few comments, but that code is so easy to read that I few that adding comments is some what redundant. rss

Anyway, that code is based on this one that works fine, but it keeps ativating the garbage collector, because it keeps instantiating and destroying the skidmarks:

using UnityEngine;
using System.Collections;

public class Skidding : MonoBehaviour
{
	public float currentFrictionValue;    
	private float skidAt = 1.5f;    
	public GameObject skidSound;      
	private float soundEmission = 15f;   
	private float soundWait;       
	public float markWidth = 0.2f;      
	private int skidding;  
	private Vector3[] lastPost = new Vector3[2];  
	public Material skidMaterial;

	void Update ()
	{
		WheelHit hit;
		WheelCollider wheel = (WheelCollider)collider;
		wheel.GetGroundHit (out hit);

		currentFrictionValue = Mathf.Abs (hit.sidewaysSlip);
		float rpm = wheel.rpm;
    
		if (skidAt <= currentFrictionValue  soundWait <= 0 || rpm < 300  soundWait <= 0  hit.collider)
		{
			Instantiate (skidSound, hit.point, Quaternion.identity);
			soundWait = 1;
		}

		if (skidAt <= currentFrictionValue || rpm < 300  hit.collider)
		{	
			SkidMesh ();
		}
		else
		{	
			skidding = 0;
		}   
	}
    
	void SkidMesh ()
	{
		WheelHit hit;           
		WheelCollider wheel = (WheelCollider)collider;              
		wheel.GetGroundHit (out hit);        
        
		GameObject mark = new GameObject ("Mark");               
		MeshFilter filter = mark.AddComponent< MeshFilter > ();   
		mark.AddComponent<MeshRenderer> ();       
		Mesh markMesh = new Mesh ();   
		Vector3[] vertices = new Vector3[4];    
		int[] triangles = new int[6];        

		if (skidding == 0)
		{            
			vertices [0] = hit.point + Quaternion.Euler (transform.eulerAngles.x, transform.eulerAngles.y, transform.eulerAngles.z) * (new Vector3 (markWidth, 0.2f, 0));                     
			vertices [1] = hit.point + Quaternion.Euler (transform.eulerAngles.x, transform.eulerAngles.y, transform.eulerAngles.z) * (new Vector3 (-markWidth, 0.2f, 0));                      
			vertices [2] = hit.point + Quaternion.Euler (transform.eulerAngles.x, transform.eulerAngles.y, transform.eulerAngles.z) * (new Vector3 (-markWidth, 0.2f, 0));                        
			vertices [3] = hit.point + Quaternion.Euler (transform.eulerAngles.x, transform.eulerAngles.y, transform.eulerAngles.z) * (new Vector3 (markWidth, 0.2f, 0));
          
			lastPost [0] = vertices [2];                      
			lastPost [1] = vertices [3];                     
			skidding = 1;                  
		}
		else
		{
			vertices [1] = lastPost [0];
			vertices [0] = lastPost [1];
			vertices [2] = hit.point + Quaternion.Euler (transform.eulerAngles.x, transform.eulerAngles.y, transform.eulerAngles.z) * (new Vector3 (-markWidth, 0.2f, 0));
			vertices [3] = hit.point + Quaternion.Euler (transform.eulerAngles.x, transform.eulerAngles.y, transform.eulerAngles.z) * (new Vector3 (markWidth, 0.2f, 0));
			lastPost [0] = vertices [2];
			lastPost [1] = vertices [3];			
		}

		triangles [0] = 0;
		triangles [1] = 1;
		triangles [2] = 2;
		triangles [3] = 2;
		triangles [4] = 3;
		triangles [5] = 0;

		markMesh.vertices = vertices;
		markMesh.triangles = triangles;
		markMesh.RecalculateNormals ();

		var uvm = new Vector2[4];
		uvm [0] = new Vector2 (1, 0);
		uvm [1] = new Vector2 (0, 0);
		uvm [2] = new Vector2 (0, 1);
		uvm [3] = new Vector2 (1, 1);
        
		markMesh.uv = uvm;
		filter.mesh = markMesh;
		mark.renderer.material = skidMaterial;
		mark.AddComponent<DestroyTimer> ().destroyAfter = 4f;
	}
}

And the first code, also work, more or less. It does not give any errors at all, but it does not show the skidmarks.

Better late than never, here’s a script that creates a skidmark mesh without all the garbage generation: http://www.scrapsgame.com/a-skidmark-effect-for-vehicles-in-unity3d/