Ejemplo n.º 1
0
        protected override void BuildMeshComponents()
        {
            #region DoubleCollider
            if (useDoubleCollider)
            {
                cachedVertsLeft  = new List <Vector2>();
                cachedVertsRight = new List <Vector2>();
            }
            #endregion

            List <Vector3> verticesList  = new List <Vector3>();
            List <int>     trianglesList = new List <int>();

            Vector2 center = new Vector2();
            for (int i = 0; i < lineVerts.Length; i++)
            {
                center += lineVerts[i];
            }
            center /= lineVerts.Length;
            for (int i = 0; i < lineVerts.Length; i++)
            {
                lineVerts[i] -= center;
            }

            int currentVertIndex = 0;
            int currentTriIndex  = 0;
            //add first two vertices
            float   angle = Mathf.Atan2(lineVerts[1].y - lineVerts[0].y, lineVerts[1].x - lineVerts[0].x);
            float   oldAngle, angleDiff;
            Vector2 p1 = new Vector2(Mathf.Cos(angle + deg90), Mathf.Sin(angle + deg90)) * lineWidth;
            Vector2 p2 = new Vector2(Mathf.Cos(angle - deg90), Mathf.Sin(angle - deg90)) * lineWidth;
            if (p1 != p2)
            {
                verticesList.Add(lineVerts[currentVertIndex] + p1);
                verticesList.Add(lineVerts[currentVertIndex] + p2);
                #region DoubleCollider
                if (useDoubleCollider)
                {
                    cachedVertsLeft.Add(verticesList[verticesList.Count - 2]);
                    cachedVertsRight.Add(verticesList[verticesList.Count - 1]);
                }
                #endregion
            }
            else
            {
                verticesList.Add(lineVerts[currentVertIndex]);
                #region DoubleCollider
                if (useDoubleCollider)
                {
                    cachedVertsLeft.Add(verticesList[verticesList.Count - 1]);
                    cachedVertsRight.Add(verticesList[verticesList.Count - 1]);
                }
                #endregion
            }
            oldAngle = angle;
            currentVertIndex++;
            // add middle vertices
            for (int i = 0; i < lineVerts.Length - 2; i++, currentVertIndex++)
            {
                angle     = Mathf.Atan2(lineVerts[currentVertIndex + 1].y - lineVerts[currentVertIndex].y, lineVerts[currentVertIndex + 1].x - lineVerts[currentVertIndex].x);
                angleDiff = oldAngle + MeshHelper.AngleDifference(oldAngle, angle) * 0.5f;
                p1        = new Vector2(Mathf.Cos(angleDiff + deg90), Mathf.Sin(angleDiff + deg90)) * lineWidth;
                p2        = new Vector2(Mathf.Cos(angleDiff - deg90), Mathf.Sin(angleDiff - deg90)) * lineWidth;
                if (p1 != p2)
                {
                    verticesList.Add(lineVerts[currentVertIndex] + p1);
                    verticesList.Add(lineVerts[currentVertIndex] + p2);
                    trianglesList.Add(currentTriIndex + 0);
                    trianglesList.Add(currentTriIndex + 3);
                    trianglesList.Add(currentTriIndex + 1);
                    trianglesList.Add(currentTriIndex + 3);
                    trianglesList.Add(currentTriIndex + 0);
                    trianglesList.Add(currentTriIndex + 2);
                    currentTriIndex += 2;
                }
                else
                {
                    verticesList.Add(lineVerts[currentTriIndex] + p1);
                    if (verticesList[verticesList.Count - 1] != verticesList[verticesList.Count - 2])
                    {
                        trianglesList.Add(currentTriIndex + 0);
                        trianglesList.Add(currentTriIndex + 3);
                        trianglesList.Add(currentTriIndex + 1);
                        currentTriIndex++;
                    }
                }
                #region DoubleCollider
                if (useDoubleCollider)
                {
                    cachedVertsLeft.Add(verticesList[verticesList.Count - 2]);
                    cachedVertsRight.Add(verticesList[verticesList.Count - 1]);
                }
                #endregion
                oldAngle = angle;
            }

            //add last two vertices
            if (lineVerts[0] != lineVerts[currentVertIndex])
            {
                angle = Mathf.Atan2(lineVerts[currentVertIndex].y - lineVerts[currentVertIndex - 1].y, lineVerts[currentVertIndex].x - lineVerts[currentVertIndex - 1].x);
                p1    = new Vector2(Mathf.Cos(angle + deg90), Mathf.Sin(angle + deg90)) * lineWidth;
                p2    = new Vector2(Mathf.Cos(angle - deg90), Mathf.Sin(angle - deg90)) * lineWidth;
                if (p1 != p2)
                {
                    verticesList.Add(lineVerts[currentVertIndex] + p1);
                    verticesList.Add(lineVerts[currentVertIndex] + p2);
                    trianglesList.Add(currentTriIndex + 0);
                    trianglesList.Add(currentTriIndex + 3);
                    trianglesList.Add(currentTriIndex + 1);
                    trianglesList.Add(currentTriIndex + 3);
                    trianglesList.Add(currentTriIndex + 0);
                    trianglesList.Add(currentTriIndex + 2);
                }
                else
                {
                    //make LineMesh loop
                    if (verticesList[verticesList.Count - 1] != verticesList[verticesList.Count - 2])
                    {
                        verticesList.Add(lineVerts[currentTriIndex] + p1);
                        trianglesList.Add(currentTriIndex + 0);
                        trianglesList.Add(currentTriIndex + 3);
                        trianglesList.Add(currentTriIndex + 1);
                    }
                }
                #region DoubleCollider
                if (useDoubleCollider)
                {
                    cachedVertsLeft.Add(verticesList[verticesList.Count - 2]);
                    cachedVertsRight.Add(verticesList[verticesList.Count - 1]);
                }
                #endregion
            }
            else
            {
                oldAngle = Mathf.Atan2(
                    lineVerts[0].y - lineVerts[currentVertIndex].y,
                    lineVerts[0].x - lineVerts[currentVertIndex].x);
                angle = Mathf.Atan2(
                    lineVerts[1].y - lineVerts[0].y,
                    lineVerts[1].x - lineVerts[0].x);
                angleDiff       = oldAngle + MeshHelper.AngleDifference(oldAngle, angle) * 0.5f - deg90;
                p1              = new Vector2(Mathf.Cos(angleDiff - deg90), Mathf.Sin(angleDiff - deg90)) * lineWidth;
                p2              = new Vector2(Mathf.Cos(angleDiff + deg90), Mathf.Sin(angleDiff + deg90)) * lineWidth;
                verticesList[0] = lineVerts[currentVertIndex] + p1;
                verticesList[1] = lineVerts[currentVertIndex] + p2;
                #region DoubleCollider
                if (useDoubleCollider)
                {
                    cachedVertsLeft[0]  = verticesList[0];
                    cachedVertsRight[0] = verticesList[1];
                    cachedVertsLeft.Add(verticesList[verticesList.Count - 2]);
                    cachedVertsRight.Add(verticesList[verticesList.Count - 1]);
                }
                #endregion

                trianglesList.Add(0);
                trianglesList.Add(verticesList.Count - 1);
                trianglesList.Add(1);
                trianglesList.Add(verticesList.Count - 1);
                trianglesList.Add(0);
                trianglesList.Add(verticesList.Count - 2);
            }
            Vertices  = verticesList.ToArray();
            Triangles = trianglesList.ToArray();

            UVs = MeshHelper.UVUnwrap(Vertices);
        }