Search code examples
unity-game-enginegameobject

How to add to scene own gameobject on unity


I create my own cube. I use below code to do it

void Start () {

    MeshFilter meshFilter = gameObject.GetComponent<MeshFilter>();
    Mesh mesh = new Mesh ();
    meshFilter.mesh = mesh;

    mesh.vertices = new Vector3[]{
        // face 1 (xy plane, z=0)
        new Vector3(0,0,0), 
        new Vector3(1,0,0), 
        new Vector3(1,1,0), 
        new Vector3(0,1,0), 
        // face 2 (zy plane, x=1)
        new Vector3(1,0,0), 
        new Vector3(1,0,1), 
        new Vector3(1,1,1), 
        new Vector3(1,1,0), 
        // face 3 (xy plane, z=1)
        new Vector3(1,0,1), 
        new Vector3(0,0,1), 
        new Vector3(0,1,1), 
        new Vector3(1,1,1), 
        // face 4 (zy plane, x=0)
        new Vector3(0,0,1), 
        new Vector3(0,0,0), 
        new Vector3(0,1,0), 
        new Vector3(0,1,1), 
        // face 5  (zx plane, y=1)
        new Vector3(0,1,0), 
        new Vector3(1,1,0), 
        new Vector3(1,1,1), 
        new Vector3(0,1,1), 
        // face 6 (zx plane, y=0)
        new Vector3(0,0,0), 
        new Vector3(0,0,1), 
        new Vector3(1,0,1), 
        new Vector3(1,0,0), 
    };

    int faces = 6; // here a face = 2 triangles

    List<int> triangles = new List<int>();
    List<Vector2> uvs = new List<Vector2>();

    for (int i = 0; i < faces; i++) {
        int triangleOffset = i*4;
        triangles.Add(0+triangleOffset);
        triangles.Add(2+triangleOffset);
        triangles.Add(1+triangleOffset);

        triangles.Add(0+triangleOffset);
        triangles.Add(3+triangleOffset);
        triangles.Add(2+triangleOffset);

        // same uvs for all faces
        uvs.Add(new Vector2(0,0));
        uvs.Add(new Vector2(1,0));
        uvs.Add(new Vector2(1,1));
        uvs.Add(new Vector2(0,1));
    }

    mesh.triangles = triangles.ToArray();
    mesh.uv = uvs.ToArray();

    GetComponent<Renderer>().material = new Material(Shader.Find("Diffuse"));

    mesh.RecalculateNormals(); 
    mesh.RecalculateBounds (); 
    mesh.Optimize();

I want to add this object many times at runtime. I create a prefab by click right button on editor. I drag gameobject to it. I create a member variable public Gameobject prefab. I drag prefab to member variable on inspector.

I want to add 2 cube on my scene. I use below code but it doesn't work for me. It adds many objects.

enter image description here

I use below code clone and add object

prefab = gameObject;
//  for (int i = 0; i < 3; i++) {
    gO = Instantiate (prefab, new Vector3 (0 * 1.8F - 8.2f, 0, 0), Quaternion.identity) as GameObject;
//  }

How can I create a prefab from my own gameobject? How can I add it to scene at runtime properly? EDIT

If I create unity shape from editor, and I drag it to prefab, I can add many object on C# code. But I can't do same work for my own cube.


Solution

  • So in the end you have 2 Scripts:

    public class CubeFactory : MonoBehaviour
    {
         public GameObject PrefabToCreate;
         // Use this for initialization
         void Start () {
         var cube = Instantiate(PrefabToCreate, new Vector3(0 * 1.8F - 8.2f, 0, 0), Quaternion.identity) as GameObject;
        }
    
        // Update is called once per frame
        void Update () {
    
        }
    }
    

    and

    public class Cube : MonoBehaviour
    {
        private void Start()
        {
    
            MeshFilter meshFilter = gameObject.GetComponent<MeshFilter>();
            Mesh mesh = new Mesh();
            meshFilter.mesh = mesh;
    
            mesh.vertices = new Vector3[]
            {
                // face 1 (xy plane, z=0)
                new Vector3(0, 0, 0),
                new Vector3(1, 0, 0),
                new Vector3(1, 1, 0),
                new Vector3(0, 1, 0),
                // face 2 (zy plane, x=1)
                new Vector3(1, 0, 0),
                new Vector3(1, 0, 1),
                new Vector3(1, 1, 1),
                new Vector3(1, 1, 0),
                // face 3 (xy plane, z=1)
                new Vector3(1, 0, 1),
                new Vector3(0, 0, 1),
                new Vector3(0, 1, 1),
                new Vector3(1, 1, 1),
                // face 4 (zy plane, x=0)
                new Vector3(0, 0, 1),
                new Vector3(0, 0, 0),
                new Vector3(0, 1, 0),
                new Vector3(0, 1, 1),
                // face 5  (zx plane, y=1)
                new Vector3(0, 1, 0),
                new Vector3(1, 1, 0),
                new Vector3(1, 1, 1),
                new Vector3(0, 1, 1),
                // face 6 (zx plane, y=0)
                new Vector3(0, 0, 0),
                new Vector3(0, 0, 1),
                new Vector3(1, 0, 1),
                new Vector3(1, 0, 0),
            };
    
            int faces = 6; // here a face = 2 triangles
    
            List<int> triangles = new List<int>();
            List<Vector2> uvs = new List<Vector2>();
    
            for (int i = 0; i < faces; i++)
            {
                int triangleOffset = i*4;
                triangles.Add(0 + triangleOffset);
                triangles.Add(2 + triangleOffset);
                triangles.Add(1 + triangleOffset);
    
                triangles.Add(0 + triangleOffset);
                triangles.Add(3 + triangleOffset);
                triangles.Add(2 + triangleOffset);
    
                // same uvs for all faces
                uvs.Add(new Vector2(0, 0));
                uvs.Add(new Vector2(1, 0));
                uvs.Add(new Vector2(1, 1));
                uvs.Add(new Vector2(0, 1));
            }
    
            mesh.triangles = triangles.ToArray();
            mesh.uv = uvs.ToArray();
    
            GetComponent<Renderer>().material = new Material(Shader.Find("Diffuse"));
    
            mesh.RecalculateNormals();
            mesh.RecalculateBounds();
            mesh.Optimize();
        }
    }
    

    in your Scene you have your Camera and a GameObject with the CubeFactory on it.

    Before you have to make a Prefab. Wich contains a GameObject with the "Cube.cs" Script on it.

    Add the prefab as "PrefabToCreate" to your Cubefactory in the inspector.