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;
}
}