Search Unity

  1. Welcome to the Unity Forums! Please take the time to read our Code of Conduct to familiarize yourself with the forum rules and how to post constructively.
  2. We have updated the language to the Editor Terms based on feedback from our employees and community. Learn more.
    Dismiss Notice

How to make a hexagon with quads

Discussion in 'General Graphics' started by Oddinx, Jul 24, 2019.

  1. Oddinx

    Oddinx

    Joined:
    Mar 2, 2017
    Posts:
    12
    Hello, i'm trying to create a hexagon with quad but the hexagon looks like this:




    This is the code:

    Code (CSharp):
    1. using System.Collections;
    2. using System.Collections.Generic;
    3. using UnityEngine;
    4.  
    5. public class CreateQuads : MonoBehaviour {
    6.  
    7.     public Material cubeMaterial;
    8.  
    9.     enum Hexside {BOTTOM,BOTTOMLEFT,BOTTOMRIGHT,TOPLEFT,TOPRIGHT, TOP,  FRONT,FRONTLEFT,FRONTRIGHT, BACK,LEFT,RIGHT};
    10.  
    11.     void CreateQuad(Hexside side)
    12.     {
    13.         Mesh mesh = new Mesh();
    14.         mesh.name = "ScriptedMesh" + side.ToString();
    15.  
    16.         Vector3[] vertices = new Vector3[4];
    17.         Vector3[] normals = new Vector3[4];
    18.         Vector2[] uvs = new Vector2[4];
    19.         int[] triangles = new int[6];
    20.  
    21.         //all possible UVs
    22.         Vector2 uv00 = new Vector2( 0f, 0f );
    23.         Vector2 uv10 = new Vector2( 1f, 0f );
    24.         Vector2 uv01 = new Vector2( 0f, 1f );
    25.         Vector2 uv11 = new Vector2( 1f, 1f );
    26.  
    27.         //all possible vertices
    28.       // BOTTOM
    29.         Vector3 p0 = new Vector3( 0.5f,  0.0f,  -0.25f );
    30.         Vector3 p1 = new Vector3(  0.25f,  -0.43f,  -0.25f );
    31.         Vector3 p2 = new Vector3(  -0.25f,  -0.43f, -0.25f );
    32.         Vector3 p3 = new Vector3( -0.5f,  0.0f, -0.25f );      
    33.         Vector3 p4 = new Vector3( -0.25f,   0.43f,  -0.25f );
    34.         Vector3 p5 = new Vector3(  0.25f,   0.43f,  -0.25f );
    35.         //TOP
    36.         Vector3 p6 = new Vector3(  0.5f,   -0.0f, 0.25f );
    37.         Vector3 p7 = new Vector3( 0.25f,   -0.43f, 0.25f );
    38.         Vector3 p8 = new Vector3( -0.25f,   -0.43f, 0.25f );
    39.         Vector3 p9 = new Vector3( -0.5f,   -0.0f, 0.25f );
    40.         Vector3 p10 = new Vector3( -0.25f,   0.43f, 0.25f );
    41.         Vector3 p11 = new Vector3( 0.25f,   0.43f, 0.25f );
    42.  
    43.         switch(side)
    44.         {
    45.             case Hexside.BOTTOM:
    46.                 vertices = new Vector3[] {p0, p1, p3, p4};
    47.                 normals = new Vector3[] {Vector3.down, Vector3.down,
    48.                                             Vector3.down, Vector3.down};
    49.                 uvs = new Vector2[] {uv11, uv01, uv00, uv10};
    50.                 triangles = new int[] { 3, 1, 0, 3, 2, 1};
    51.             break;
    52.  
    53.             case Hexside.BOTTOMLEFT:
    54.                 vertices = new Vector3[] {p1, p2, p4, p5};
    55.                 normals = new Vector3[] {Vector3.down, Vector3.down,
    56.                                             Vector3.down, Vector3.down};
    57.                 uvs = new Vector2[] {uv11, uv01, uv00, uv10};
    58.                 triangles = new int[] { 3, 1, 0, 3, 2, 1};
    59.             break;
    60.  
    61.                  case Hexside.BOTTOMRIGHT:
    62.                 vertices = new Vector3[] {p2, p3, p5, p0};
    63.                 normals = new Vector3[] {Vector3.down, Vector3.down,
    64.                                             Vector3.down, Vector3.down};
    65.                 uvs = new Vector2[] {uv11, uv01, uv00, uv10};
    66.                 triangles = new int[] { 3, 1, 0, 3, 2, 1};
    67.             break;
    68.  
    69.             case Hexside.TOP:
    70.                 vertices = new Vector3[] {p10,p9,p7,p6};
    71.                 normals = new Vector3[] {Vector3.up, Vector3.up,
    72.                                             Vector3.up, Vector3.up};
    73.                 uvs = new Vector2[] {uv11, uv01, uv00, uv10};
    74.                 triangles = new int[] {3, 1, 0, 3, 2, 1};
    75.             break;
    76.  
    77.          
    78.             case Hexside.TOPLEFT:
    79.                 vertices = new Vector3[] {p9,p8,p6,p11};
    80.                 normals = new Vector3[] {Vector3.up, Vector3.up,
    81.                                             Vector3.up, Vector3.up};
    82.                 uvs = new Vector2[] {uv11, uv01, uv00, uv10};
    83.                 triangles = new int[] {3, 1, 0, 3, 2, 1};
    84.             break;
    85.  
    86.              case Hexside.TOPRIGHT:
    87.                 vertices = new Vector3[] {p8,p7,p11,p10};
    88.                 normals = new Vector3[] {Vector3.up, Vector3.up,
    89.                                             Vector3.up, Vector3.up};
    90.                 uvs = new Vector2[] {uv11, uv01, uv00, uv10};
    91.                 triangles = new int[] {3, 1, 0, 3, 2, 1};
    92.             break;
    93.  
    94.  
    95.  
    96.             case Hexside.FRONTLEFT:
    97.                 vertices = new Vector3[] {p11, p6, p0, p5};
    98.                 normals = new Vector3[] {Vector3.left, Vector3.left,
    99.                                             Vector3.left, Vector3.left};
    100.                 uvs = new Vector2[] {uv11, uv01, uv00, uv10};
    101.                 triangles = new int[] {3, 1, 0, 3, 2, 1};
    102.             break;
    103.             case Hexside.FRONTRIGHT:
    104.                 vertices = new Vector3[] {p7, p8, p2, p1};
    105.                 normals = new Vector3[] {Vector3.right, Vector3.right,
    106.                                             Vector3.right, Vector3.right};
    107.                 uvs = new Vector2[] {uv11, uv01, uv00, uv10};
    108.                 triangles = new int[] {3, 1, 0, 3, 2, 1};
    109.             break;
    110.  
    111.             case Hexside.FRONT:
    112.                 vertices = new Vector3[] {p6, p7, p1, p0};
    113.                 normals = new Vector3[] {Vector3.forward, Vector3.forward,
    114.                                             Vector3.forward, Vector3.forward};
    115.                 uvs = new Vector2[] {uv11, uv01, uv00, uv10};
    116.                 triangles = new int[] {3, 1, 0, 3, 2, 1};
    117.             break;
    118.  
    119.              case Hexside.LEFT:
    120.                 vertices = new Vector3[] {p10, p11, p5, p4};
    121.                 normals = new Vector3[] {Vector3.left, Vector3.left,
    122.                                             Vector3.left, Vector3.left};
    123.                 uvs = new Vector2[] {uv11, uv01, uv00, uv10};
    124.                 triangles = new int[] {3, 1, 0, 3, 2, 1};
    125.             break;
    126.  
    127.                 case Hexside.RIGHT:
    128.                 vertices = new Vector3[] {p8, p9, p3, p2};
    129.                 normals = new Vector3[] {Vector3.right, Vector3.right,
    130.                                             Vector3.right, Vector3.right};
    131.                 uvs = new Vector2[] {uv11, uv01, uv00, uv10};
    132.                 triangles = new int[] {3, 1, 0, 3, 2, 1};
    133.             break;
    134.  
    135.             case Hexside.BACK:
    136.                 vertices = new Vector3[] {p9, p10, p4, p3};
    137.                 normals = new Vector3[] {Vector3.back, Vector3.back,
    138.                                             Vector3.back, Vector3.back};
    139.                 uvs = new Vector2[] {uv11, uv01, uv00, uv10};
    140.                 triangles = new int[] {3, 1, 0, 3, 2, 1};
    141.             break;
    142.         }
    143.  
    144.         mesh.vertices = vertices;
    145.         mesh.normals = normals;
    146.         mesh.uv = uvs;
    147.         mesh.triangles = triangles;
    148.        
    149.         mesh.RecalculateBounds();
    150.      
    151.         GameObject quad = new GameObject("Quad");
    152.         quad.transform.parent = this.gameObject.transform;
    153.          MeshFilter meshFilter = (MeshFilter) quad.AddComponent(typeof(MeshFilter));
    154.         meshFilter.mesh = mesh;
    155.         MeshRenderer renderer = quad.AddComponent(typeof(MeshRenderer)) as MeshRenderer;
    156.         renderer.material = cubeMaterial;
    157.     }
    158.  
    159.     void CombineQuads()
    160.     {
    161.      
    162.         //1. Combine all children meshes
    163.         MeshFilter[] meshFilters = GetComponentsInChildren<MeshFilter>();
    164.         CombineInstance[] combine = new CombineInstance[meshFilters.Length];
    165.         int i = 0;
    166.         while (i < meshFilters.Length) {
    167.             combine[i].mesh = meshFilters[i].sharedMesh;
    168.             combine[i].transform = meshFilters[i].transform.localToWorldMatrix;
    169.             i++;
    170.         }
    171.  
    172.         //2. Create a new mesh on the parent object
    173.         MeshFilter mf = (MeshFilter) this.gameObject.AddComponent(typeof(MeshFilter));
    174.         mf.mesh = new Mesh();
    175.  
    176.         //3. Add combined meshes on children as the parent's mesh
    177.         mf.mesh.CombineMeshes(combine);
    178.  
    179.         //4. Create a renderer for the parent
    180.         MeshRenderer renderer = this.gameObject.AddComponent(typeof(MeshRenderer)) as MeshRenderer;
    181.         renderer.material = cubeMaterial;
    182.  
    183.         //5. Delete all uncombined children
    184.         foreach (Transform quad in this.transform) {
    185.              Destroy(quad.gameObject);
    186.          }
    187.  
    188.     }
    189.  
    190.     void CreateHex()
    191.     {
    192.         CreateQuad(Hexside.FRONT);
    193.         CreateQuad(Hexside.BACK);
    194.         CreateQuad(Hexside.TOP);
    195.         CreateQuad(Hexside.TOPLEFT);
    196.         CreateQuad(Hexside.TOPRIGHT);
    197.         CreateQuad(Hexside.BOTTOM);
    198.         CreateQuad(Hexside.BOTTOMLEFT);
    199.         CreateQuad(Hexside.BOTTOMRIGHT);
    200.         CreateQuad(Hexside.FRONTLEFT);
    201.          CreateQuad(Hexside.FRONTRIGHT);
    202.         CreateQuad(Hexside.LEFT);
    203.         CreateQuad(Hexside.RIGHT);
    204.         CombineQuads();
    205.     }
    206.  
    207.     // Use this for initialization
    208.     void Start () {
    209.         CreateHex();
    210.     }
    211.  
    212.     // Update is called once per frame
    213.     void Update () {
    214.      
    215.     }
    216. }
    217.  
     

    Attached Files:

  2. Antypodish

    Antypodish

    Joined:
    Apr 29, 2014
    Posts:
    10,594
    You may have specific need, for generating your hex-quad. But I would ask, just in case.
    Can you not import already textured quad mesh with texture, from some external 3D software? For example blender? It would save a lot of time and effort.
     
  3. Oddinx

    Oddinx

    Joined:
    Mar 2, 2017
    Posts:
    12
    Well, I can import a 3D FBX, but I want to learn to make some objects with code, that's why i'm trying to make a hexagon.
     
  4. Antypodish

    Antypodish

    Joined:
    Apr 29, 2014
    Posts:
    10,594
    Sure. If you that what you want / need.

    Unfortunately I won't be able to assist you on that matter.
    I was playing with meshes / UV while ago. Now I am rusted :)
    Others will be more suitable on discussed topic.