Generate 3D items using Mesh

Effect:

Code implementation

Pyramid:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class YuanZhui : MonoBehaviour
{
    int num = 30;
    int r = 2;

    // Start is called before the first frame update
    void Start()
    {
        gameObject.AddComponent<MeshFilter>();
        gameObject.AddComponent<MeshCollider>();
        gameObject.AddComponent<MeshRenderer>();

        float angle = 2 * Mathf.PI / num;
        VertexHelper vh = new VertexHelper();
        vh.AddVert(Vector3.up * 3, Color.blue, Vector2.zero);

        for (int i = 0; i < num; i + + )
        {
            float x = Mathf.Sin(i * angle) * r;
            float z = Mathf.Cos(i * angle) * r;

            vh.AddVert(new Vector3(x, 0, z), Color.blue, Vector2.zero);

            if(i==0)
            {
                vh.AddTriangle(0, num, 1);
            }
            else
            {
                vh.AddTriangle(0, i, i + 1);
            }
        }

        //share vertices
        vh.AddVert(Vector3.zero, Color.black, Vector2.zero);
        for (int i = 0; i < num; i + + )
        {
            if(i==0)
            {
                vh.AddTriangle(1, num, num + 1);
            }
            else
            {
                vh.AddTriangle(i + 1, i, num + 1);
            }
        }

        //Do not share vertices
        //vh.AddVert(Vector3.zero, Color.white, Vector2.zero);
        //for (int i = 0; i < num; i + + )
        //{
        // float x = Mathf.Sin(i * angle) * r;
        // float z = Mathf.Cos(i * angle) * r;

        // vh.AddVert(new Vector3(x, 0, z), Color.white, Vector2.zero);

        // if (i == 0)
        // {
        // vh.AddTriangle(num + 2, 2 * num + 1, num + 1);
        // }
        //else
        // {
        // vh.AddTriangle(num + 2 + i, num + 1 + i, num + 1);
        // }
        //}

        Mesh mesh = new Mesh();
        vh.FillMesh(mesh);

        GetComponent<MeshFilter>().mesh = mesh;
        GetComponent<MeshCollider>().sharedMesh = mesh;
        GetComponent<MeshRenderer>().material.color = Color.cyan;

    }
}

Cylinder:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using static System.Net.Mime.MediaTypeNames;

public class YuanZhu : MonoBehaviour
{
    int num = 10;
    int r = 2;

    // Start is called before the first frame update
    void Start()
    {
        gameObject.AddComponent<MeshFilter>();
        gameObject.AddComponent<MeshRenderer>();
        gameObject.AddComponent<MeshCollider>();

        VertexHelper vh = new VertexHelper();
        float angle = 2 * Mathf.PI / num;


        for (int i = 0; i < num; i + + )
        {
            float x = Mathf.Sin(angle * i) * r;
            float z = Mathf.Cos(angle * i) * r;
            vh.AddVert(new Vector3(x, 0, z), Color.white, Vector2.zero);
            vh.AddVert(new Vector3(x, 3, z), Color.white, Vector2.zero);
        }
        vh.AddVert(Vector3.zero, Color.white, Vector2.zero);
        vh.AddVert(Vector3.up * 3, Color.white, Vector2.zero);


        for (int i = 0; i < num; i + + )
        {
            //all around
            if (i == num - 1)
            {
                vh.AddTriangle(1, i * 2 + 1, i * 2);
                vh.AddTriangle(0, 1, i * 2);
            }
            else
            {
                vh.AddTriangle((i + 1) * 2 + 1, i * 2 + 1, i * 2);
                vh.AddTriangle((i + 1) * 2, (i + 1) * 2 + 1, i * 2);
            }

            //up and down
            if(i==0)
            {
                vh.AddTriangle(1, 2 * num + 1, 2 * (num - 1) + 1);//Up
                vh.AddTriangle(2 * (num - 1), 2 * num, 0);//Next
            }
            else
            {
                vh.AddTriangle(2 * (i - 1) + 1, 2 * i + 1, 2 * num + 1);
                vh.AddTriangle(2 * i, 2 * (i - 1), 2 * num);
            }
        }
        Mesh mesh = new Mesh();
        vh.FillMesh(mesh);

        GetComponent<MeshFilter>().mesh = mesh;
        GetComponent<MeshCollider>().sharedMesh = mesh;
        GetComponent<MeshRenderer>().material.color = Color.gray;
    }
}

Ball:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class Qiu : MonoBehaviour
{
    public int num = 8;
    public float r = 5;

    // Start is called before the first frame update
    void Start()
    {
        gameObject.AddComponent<MeshFilter>();
        gameObject.AddComponent<MeshCollider>();
        gameObject.AddComponent<MeshRenderer>();

        VertexHelper vh = new VertexHelper();
        float angle = 2 * Mathf.PI / num;
        for (int i = 0; i < num / 2 + 1; i + + )
        {
            float y = Mathf.Cos(angle * i) * r;
            float xr = Mathf.Sin(angle * i) * r;
            float uvy = (float)i / (num / 2);
            for (int j = 0; j < num; j + + )
            {
                float x = Mathf.Sin(angle * j) * xr;
                float z = Mathf.Cos(angle * j) * xr;
                float uvx = (float)j / num;
                vh.AddVert(new Vector3(x, y, z), Color.white, new Vector2(uvx, uvy));
                if (j == num - 1)
                {
                    float x0 = Mathf.Sin(0) * xr;
                    float z0 = Mathf.Cos(0) * xr;
                    vh.AddVert(new Vector3(x0, y, z0), Color.white, new Vector2(1, uvy));
                }
                if (i < num / 2)
                {
                    vh.AddTriangle(i * (num + 1) + j, (i + 1) * (num + 1) + j, i * (num + 1) + j + 1);
                    vh.AddTriangle(i * (num + 1) + j + 1, (i + 1) * (num + 1) + j, (i + 1) * (num + 1) + j + 1);
                }
            }
        }
        Mesh mesh = new Mesh();
        vh.FillMesh(mesh);
        GetComponent<MeshFilter>().mesh = mesh;
        GetComponent<MeshCollider>().sharedMesh = mesh;
        GetComponent<MeshRenderer>().material.color = Color.blue;

    }
}

Prism/Prism:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class LengTai : MonoBehaviour
{
    int num = 8;
    int r0 = 3;
    int r1 = 1;
    //r0 and r1 are equal to an edge.

    // Start is called before the first frame update
    void Start()
    {
        gameObject.AddComponent<MeshFilter>();
        gameObject.AddComponent<MeshCollider>();
        gameObject.AddComponent<MeshRenderer>();

        VertexHelper vh = new VertexHelper();
        float angle = 2 * Mathf.PI / num;

        for (int i = 0; i < num; i + + )
        {
            float x0 = Mathf.Sin(angle * i) * r0;
            float z0 = Mathf.Cos(angle * i) * r0;
            vh.AddVert(new Vector3(x0, 0, z0), Color.white, Vector2.zero);

            float x1 = Mathf.Sin(angle * i) * r1;
            float z1 = Mathf.Cos(angle * i) * r1;
            vh.AddVert(new Vector3(x1, 3, z1), Color.white, Vector2.zero);
        
        }


        for (int i = 0; i < num; i + + )
        {
            if (i == num - 1)
            {
                vh.AddTriangle(0, 2 * i + 1, 2 * i);
                vh.AddTriangle(0, 1, 2 * i + 1);
            }
            else
            {
                vh.AddTriangle(2 * i, 2 * (i + 1) + 1, 2 * i + 1);
                vh.AddTriangle(2 * i, 2 * (i + 1), 2 * (i + 1) + 1);
            }

            if (num == 3)
            {

                vh.AddTriangle(4, 2, 0);
                vh.AddTriangle(1, 3, 5);
            }
            else
            {
                if (i > 1 & amp; & amp; i < num - 1)
                {
                    vh.AddTriangle(0, (i + 1) * 2, i * 2);
                    vh.AddTriangle(i * 2 + 1, (i + 1) * 2 + 1, 1);
                    if(i==2)
                    {
                        vh.AddTriangle(2 * i, (i - 1) * 2, 0);
                        vh.AddTriangle(1, (i - 1) * 2 + 1, 2 * i + 1);
                    }
                }
            }
        }

        Mesh mesh = new Mesh();
        vh.FillMesh(mesh);
        GetComponent<MeshFilter>().mesh = mesh;
        GetComponent<MeshCollider>().sharedMesh = mesh;
        GetComponent<MeshRenderer>().material.color = Color.green;
    }

}

Draggable generation area:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class MyMesh : MonoBehaviour
{
    public Transform[] trans;
    Mesh mesh;
    VertexHelper vh;
    // Start is called before the first frame update
    void Start()
    {
        mesh = new Mesh();
        vh = new VertexHelper();
        mesh.vertices = new Vector3[trans.Length];
        for (int i = 0; i < trans.Length; i + + )
        {
            vh.AddVert(trans[i].position, Color.white, Vector2.zero);
        }
        vh.AddTriangle(0, 1, 2);
        vh.AddTriangle(0, 2, 1);
        vh.FillMesh(mesh);
        gameObject.AddComponent<MeshFilter>().mesh = mesh;
        gameObject.AddComponent<MeshCollider>().sharedMesh = mesh;
        gameObject.AddComponent<MeshRenderer>().material.color = Color.red;
    }

    // Update is called once per frame
    void Update()
    {
        vh.Clear();
        mesh.Clear();
        for (int i = 0; i < trans.Length; i + + )
        {
            vh.AddVert(trans[i].localPosition, Color.white, Vector2.zero);
        }
        vh.AddTriangle(0, 1, 2);
        vh.AddTriangle(0, 2, 1);
        vh.FillMesh(mesh);
        gameObject.GetComponent<MeshFilter>().mesh = mesh;
        gameObject.GetComponent<MeshCollider>().sharedMesh = mesh;
        gameObject.GetComponent<MeshRenderer>().material.color = Color.red;
    }
}

Drag and drop item mounting script:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;

public class OnDragCube : MonoBehaviour
{
    public void OnMouseDrag()
    {
        Vector3 pos = Camera.main.WorldToScreenPoint(transform.position);
        Vector3 des = Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y,pos.z));
        transform.position = des;
    }
}