Unity Spain

Post Antiguos => General (Antiguo) => Mensaje iniciado por: Jose134 en Abril 26, 2016, 09:49:35 PM

Título: Mesh creado mediante codigo no actualiza
Publicado por: Jose134 en Abril 26, 2016, 09:49:35 PM
Hola gente de UnitySpain, hace siglos que no me paso por aqui y hoy me ha surgido un problema que no he conseguido arreglar de ninguna manera. Como siempre sera algo muy simple pero no lo veo xD Estaba intentando hacer un Mesh el cual se pudiera transformar de triangulo a cuadrado pero al actualizar el mesh del MeshFilter no hace nada, se queda triangulo aunque le diga que pase a ser un cuadrado :'(Os dejo el codigo completo (aunque se que no es un codigo muy agradable de leer xD)
using UnityEngine;
using System.Collections;

public class TriangleToSquare : MonoBehaviour {

    private MeshFilter mf;
    private Mesh mesh;

    public bool setTriangle;
    public bool setSquare;

    void Awake ()
    {
        mf = GetComponent<MeshFilter>();
        mesh = new Mesh();
    }

    void Start ()
    {
        mesh = InitialMesh();
        mf.mesh = mesh;
    }

    void Update ()
    {
        if (setTriangle)
        {
            Mesh newMesh = SetTriangle();
            mf.mesh = newMesh;

            setTriangle = false;
        }
        if (setSquare)
        {
            Mesh newMesh = SetSquare();
            mf.mesh = newMesh;

            setSquare = false;
        }    
    }

    private Mesh InitialMesh ()
    {
        Mesh newMesh = new Mesh();
        newMesh.name = "EditableMesh_Triangle";

        newMesh.vertices = new Vector3[]
        {
            new Vector3(0.5f, 1f, 0f),   //A - 0
            new Vector3(0f, 0f, 0f),     //B - 1
            new Vector3(1f, 0f, 0f),     //C - 2
            new Vector3(0.75f, 0.5f, 0f) //D - 3
        };
        newMesh.triangles = new int[]
        {
            3, 1, 0,
            3, 2, 1
        };
        newMesh.normals = new Vector3[]
        {
            -Vector3.forward,
            -Vector3.forward,
            -Vector3.forward,
            -Vector3.forward
        };
        newMesh.uv = new Vector2[]
        {
            new Vector2(0, 1),
            new Vector2(0, 0),
            new Vector2(1, 0),
            new Vector2(1, 1)
        };

        return newMesh;
    }

    private Mesh SetTriangle()
    {
        Mesh m = InitialMesh();

        m.name = "EditableMesh_Triangle";
        m.vertices[0] = new Vector3(0.5f, 1f, 0f);
        m.vertices[3] = new Vector3(0.75f, 0.5f, 0f);
       
        return m;
    }
    private Mesh SetSquare ()
    {
        Mesh m = InitialMesh();

        m.name = "EditableMesh_Square";
        m.vertices[0] = new Vector3(0, 1, 0);
        m.vertices[3] = new Vector3(1, 0, 0);
       
        return m;
    }
   
}
 Muchas gracias por vuestra ayuda [EDIT]Os adjunto esta foto por si sirve de algo, es un dibujito que hice mientras pensaba como hacer esto (disculpad la calidad, no se enfocar bien con mi telefono)
Título: Mesh creado mediante codigo no actualiza
Publicado por: kaito en Abril 26, 2016, 10:21:35 PM
Algo parecido me paso con otra matriz, la de color de vértices.No se pueden modificar las matrices de vertices, triángulos, normales, color, etc... directamente.Es necesario crear una nueva matriz o clon de la existente, modificarla, y asignarla.
   private Mesh SetTriangle()
{
   Mesh m = InitialMesh();
   
   m.name = "EditableMesh_Triangle";
   Vector3[] vertices = (Vector3[])m.vertices.Clone();
   vertices[0] = new Vector3(0.5f, 1f, 0f);
   vertices[3] = new Vector3(0.75f, 0.5f, 0f);
   m.vertices = vertices;

   return m;
}
private Mesh SetSquare ()
{
   Mesh m = InitialMesh();
   
   m.name = "EditableMesh_Square";
   Vector3[] vertices = (Vector3[])m.vertices.Clone();
   vertices[0] = new Vector3(0, 1, 0);
   vertices[3] = new Vector3(1, 0, 0);
   m.vertices = vertices;
   
   return m;
}
 
Título: Mesh creado mediante codigo no actualiza
Publicado por: Jose134 en Abril 26, 2016, 10:26:06 PM
[quote author=kaito date=1461702095" data-ipsquote="" data-cite="kaito" class="ipsQuote">Algo parecido me paso con otra matriz, la de color de vértices.No se pueden modificar las matrices de vertices, triángulos, normales, color, etc... directamente.Es necesario crear una nueva matriz o clon de la existente, modificarla, y asignarla.
   private Mesh SetTriangle(){
   Mesh m = InitialMesh();
   
   m.name = "EditableMesh_Triangle";
   Vector3[] vertices = (Vector3[])m.vertices.Clone();
   vertices[0] = new Vector3(0.5f, 1f, 0f);
   vertices[3] = new Vector3(0.75f, 0.5f, 0f);
   m.vertices = vertices;

   return m;
}
private Mesh SetSquare ()
{
   Mesh m = InitialMesh();
   
   m.name = "EditableMesh_Square";
   Vector3[] vertices = (Vector3[])m.vertices.Clone();
   vertices[0] = new Vector3(0, 1, 0);
   vertices[3] = new Vector3(1, 0, 0);
   m.vertices = vertices;
   
   return m;
}
 [/quote]Muchisimas gracias, ahora he podido arreglarlo y ademas añadi una transicion 
private Vector3[] SetTriangle()
    {
        Vector3[] vertices = mf.mesh.vertices;

        vertices[0] = Vector3.Lerp(vertices[0], new Vector3(0.5f, 1f, 0f), 10 * Time.deltaTime);
        vertices[3] = Vector3.Lerp(vertices[3], new Vector3(0.75f, 0.5f, 0f), 10 * Time.deltaTime);

        return vertices;
    }
    private Vector3[] SetSquare ()
    {
        Vector3[] vertices = mf.mesh.vertices;
       
        vertices[0] = Vector3.Lerp(vertices[0], new Vector3(0, 1, 0), 10 * Time.deltaTime);
        vertices[3] = Vector3.Lerp(vertices[3], new Vector3(1, 1, 0), 10 * Time.deltaTime);

        return vertices;
    }