Draw Plataforms with mouse

Hi Everyone,

I want the users to interact by drawing platforms like the new nintendo game, Mario Maker.

I wrote a simple prototype. The user can click with the mouse in any place of the screen, drag a little and release. The start (click) and end (release) vectors are stored. They are used to create the platform extension (a cube game object with a scale redefinition based on the start and end vectors).

This part is ok. My problem lies on the projection, the conversion between screen coordinates to world coordinates. In every place the user does the movement to create a platform, it appears always on the center of the screen.

Following, the code untill the moment.

Thanks in advance!


    using UnityEngine;
    using System.Collections;
    
        public class CreateObjects : MonoBehaviour {
        
        	//most of the variables can be private - to change
        	private Vector3 axisX;
        	public Vector3 start;
        	public Vector3 end;
        	public GameObject platform;
        	public float angle, scale; 
        	// Use this for initialization
        	void Start () 
        	{
        		axisX = new Vector3 (1, 0, 0);
        	}
        	
        	// Update is called once per frame
        	void Update () {
        
        		if (Input.GetMouseButtonDown (0)) 
        		{
        			start = Camera.main.WorldToViewportPoint(Input.mousePosition);
        		}
        
        		if (Input.GetMouseButtonUp (0)) 
        		{
        			end = Camera.main.WorldToViewportPoint(Input.mousePosition);
        			scale = Vector3.Distance (end, start);
        			Vector3 v = (end - start);
        			v.Normalize();
        			Debug.Log(v.normalized);
        			if(end.y >= start.y)
        			{
        				angle = Vector3.Angle (axisX, end - start);
        			}else{
        				angle = -Vector3.Angle (axisX, end - start);
        			}
        		}
        
        		//values of the scale - if between 5 and 15 is ok 
        		//change it after - experimental values - hard code
        		if (scale > 5 && scale < 15) 
        		{
        			StartCoroutine("Create");
        			scale = 0;
        		}
        	}
        
        	IEnumerator Create()
        	{
        		Vector3 position = Camera.main.WorldToViewportPoint((end - start));
        
        		GameObject obj = 
        			Instantiate(
        				platform, 
        				position, 
        		        Quaternion.AngleAxis(angle, new Vector3(0,0,1)))
        				as GameObject;
        
        		return null;
        	}
        }  

You seem to be converting from world coordinates to viewport coordinates, with coordinates that are already from the viewport. Possibly try this:

start = Camera.main.ScreenToWorldPoint(Input.mousePosition);

Along with changing the other occurrences. :slight_smile: