- Home /
Making a mesh transparent
Hi everyone, I'm trying to make a scenario in which the user touches the screen and unveil a another image. For example, applying a face-cream on the character face. The user needs to drag his finger (or mouse) over the face in order to apply cream on it.
One solution I got was to make a "cream" image layer on top of the "base object" (face), and play with its mesh colors (so this mechanic could work with both 2d and 3d, as long as using meshes). The problem is when i'm trying to "reset" this mesh into transparent when the scene starts. Usually it functions OK, but after I restart unity , it won't always reset.
This function is called on scene awake (sometimes works, sometimes not):
private void ResetMeshColors(MeshFilter tempMesh)
{
Color32[] colors = tempMesh.mesh.colors32;
for (int i = 0; i < colors.Length; i++)
{
colors[i] = new Color32(255, 255, 255, 0);
}
tempMesh.mesh.colors32 = colors;
Debug.Log ("Reset the cream to transparent");
}
Here is the rest of the code. It's using a radius and the meshes game objects, and synced to another script that check if the mesh is transparent or not. It works great, but it fails when the reset has failed on startup.
void Update () {
if (Input.GetButton("Fire1"))
{
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
if (Physics.Raycast(ray , out hit))
{
if (hit.collider != null)
{
MeshFilter targetMeshFilter = hit.collider.GetComponent<MeshFilter>();
if (targetMeshFilter.mesh != null)
{
PaintMeshVertices(hit.transform, targetMeshFilter.mesh, hit.point, Color.white);
}
}
}
}
}
private void PaintMeshVertices(Transform paintTransform, Mesh paintTarget, Vector3 originPoint, Color colorX)
{
Color32[] colors = paintTarget.colors32;
Vector3[] vertices = paintTarget.vertices;
bool any = false;
for (int i = 0; i < vertices.Length; i++)
{
Vector3 vertexInWorld = paintTransform.TransformPoint(vertices[i]);
if (Vector3.Distance(vertexInWorld, originPoint) <= _paintRadius)
{
colors[i] = colorX;
any = true;
}
}
// assign the colors (position + values) to the mesh to apply the paint (only if changes (bool "any") were made at all)
if (any)
{
paintTarget.colors32 = colors;
}
}
Answer by liorplayim · Feb 02, 2015 at 08:00 AM
void Awake ()
{
ResetMeshColors(_creamFace); //sending the CreamFace mesh object to the function
}
Your answer
Follow this Question
Related Questions
Spawned Object Gradient Mesh Colors? 2 Answers
Multiple Cars not working 1 Answer
Distribute terrain in zones 3 Answers
How do I sync a mesh over network? (Photon) 1 Answer
Front of mesh is more transparent than back of mesh 1 Answer