Search code examples
c#unity-game-engine3d-modelling

How to make a dynamic model in unity 3D?


I have a sample code that where it's creating dynamic walls to a mouse clicks.

using UnityEngine;
using System.Collections;

public class CreateWalls : MonoBehaviour {

    bool creating;
    public GameObject start;
    public GameObject end;

    public GameObject wallPrehab;
    GameObject wall;
    // Use this for initialization
    void Start () {

    }

    // Update is called once per frame
    void Update () {
        getinput();
    }

    /*
     *this is the method for getting mouse click inputs
     */
    void getinput(){
        if (Input.GetMouseButtonDown (0)) {
            setStart ();
        } else if (Input.GetMouseButtonUp (0)) {
            setEnd ();
        } else {
            if(creating){
                adjust();
            }
        }
    }
    /*
     * getting the mouse clicked position coordinate 
     */
    void setStart(){
        creating = true;
        start.transform.position = getWorldPoint ();
        Debug.Log("Start = " + start.transform.position);
        wall = (GameObject) Instantiate (wallPrehab, start.transform.position, Quaternion.identity);

    }

    /*
     * getting the mouse click over position coordinate
     */
    void setEnd(){
        creating = false;
        end.transform.position = getWorldPoint ();
        Debug.Log("End = " + end.transform.position);
    }

    /*
     * invoking the wall building method
     */
    void adjust(){
        end.transform.position = getWorldPoint ();
        adjustWall ();
    }

    /*
     * build the wall in between start point and the end point
     */
    void adjustWall(){
        start.transform.LookAt (end.transform.position);
        end.transform.LookAt (start.transform.position);
        float distance = Vector3.Distance (start.transform.position, end.transform.position);
        wall.transform.position = start.transform.position + distance / 2 * start.transform.forward;
        wall.transform.rotation = start.transform.rotation;
        wall.transform.localScale = new Vector3 (wall.transform.localScale.x, wall.transform.localScale.y, distance);
    }

    /*
     * method where the coordinate we taken from mouse click
     */
    Vector3 getWorldPoint(){
        Ray ray = GetComponent<Camera>().ScreenPointToRay (Input.mousePosition);
        RaycastHit hit;
        if (Physics.Raycast (ray, out hit)) {
            return hit.point;
        }
        return Vector3.zero;
    }
}

I have some coordinates, each corner of below image.

a=(55, 297)
b=(300, 297)
c=(55, 297)
d=(55, 52)

Above coordinates are for this image

now I want to build walls for those coordinates. like a box. I don't know how to put them(coordinates). basically one walls coordinates will be a(x,y) and b(x,y). another will be b(x,y) and c(x,y). can someone help me on this I'll be great


Solution

  • You can build this walls with primitives, but this get you a default 10x10 vertice plane. This is not so much efficient because you spent a lot of unneded planes.

    GameObject cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
    cube.transform.localScale = Vector3 (xsize, ysize, zsize);
    cube.transform.position = Vector3(xpos, ypos, zpos);
    

    The best solution and more complex is to make fully your own Mesh. To do it you need few things, there you have an example to do a simple plane:

    GameObject plane = new GameObject("Plane");
    MeshFilter meshFilter = (MeshFilter)plane.AddComponent(typeof(MeshFilter));
    
    Mesh mymesh = new Mesh();
    mymesh.name = "MyCustomMesh";
    mymesh.vertices = new Vector3[] {
         new Vector3(xpos, ypos, zpos),
         new Vector3(xpos, ypos, zpos),
         new Vector3(xpos, ypos, zpos),
         new Vector3(xpos, ypos, zpos),
     };
     mymesh.uv = new Vector2[] {
         new Vector2 (0, 0),
         new Vector2 (0, 1),
         new Vector2(1, 1),
         new Vector2 (1, 0)
     };
     mymesh.triangles = new int[] { 0, 1, 2, 0, 2, 3};
     mymesh.RecalculateNormals();
    
    meshFilter.mesh = mymesh;
    MeshRenderer renderer = plane.AddComponent(typeof(MeshRenderer)) as MeshRenderer;