RTS building placement with reference while placing buildings

I am building a Real time strategy type game and i’m trying to figure out how to make a building reference while placing a building. When the player clicks on the building icon for a particular building, it should have a reference for that building while moving around the terrain. Like a transparent version of the selected building. I have tried doing this but so far im only able to spawn another object right when the buttons clicked. How can I make the building reference stick onto the mouse while it moves around the terrain? Here is my code.

Note, the object i’m trying to add a reference to for starters is the Cube object.

var cash : int = 2000;
var boxIcon : Texture2D;
var sphereIcon : Texture2D;
var cylinderIcon : Texture2D;
var cubeCost : int = 400;
var sphereCost : int = 200;
var cylinderCost : int = 600;
var cubeGhost : Transform;
private var building;
private var buildingCost : int = 0;


var isHoverGUI : boolean = false; 
var rect : Rect = Rect (10,10, 150, 50);

function OnGUI () 
{

    if (GUI.Button (Rect (10,10, 50, 50), GUIContent( boxIcon, "Build a box") )) 
    {
        building = GameObject.Find("Cube");
        buildingCost = cubeCost;
		var hitGhost : RaycastHit;
var rayGhost : Ray = Camera.main.ScreenPointToRay(Input.mousePosition);
if(Physics.Raycast(rayGhost,hitGhost,300))
{

		cubeGhost.position = hitGhost.point;
}
    }

   if(GUI.Button (Rect (60,10,50,50), GUIContent( sphereIcon, "Build a sphere") ))
    {
        building = GameObject.Find("Sphere");
        buildingCost = sphereCost;
    }
 
    if(GUI.Button(Rect ( 110,10,50,50), GUIContent( cylinderIcon, "Build a cylinder") ))
    {
        building = GameObject.Find("Cylinder");
        buildingCost = cylinderCost;
		
	

    }
		isHoverGUI = rect.Contains( Event.current.mousePosition );
}

function Update () {


if(Input.GetMouseButtonDown(0) && !isHoverGUI )
{
	
var hit : RaycastHit;
var ray : Ray = Camera.main.ScreenPointToRay(Input.mousePosition);

if(Physics.Raycast(ray,hit,300)&&building && cash >= buildingCost)
{
if(hit.transform.tag == "terrain")
{
Instantiate(building,hit.point,Quaternion.identity);


switch(building)
{
	case  GameObject.Find("Sphere"):
	cash -= 200;
	break;
	
	case   GameObject.Find("Cube"):
	cash -= 400;
	break;
	
	case GameObject.Find("Cylinder"):
	cash -= 600;
	break;
	
	default: print ("nothings the case!");
break;
					}	
				}					
			}
			else
			{
			print("not enough money");
			
			}
		}
	}

I’m trying to do the same thing man and am at pretty much the same point as you. Did you get it going yet

Try using the transform position and rotation of the refrence object

Hi all!
I had the same issue and came up with this solution:

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

public class SpawnBuildings : MonoBehaviour {

	public bool placeObjects;
	public GameObject castlePrefab;

	private GameObject building;
	private bool created = false;
	private bool instantiated = false;
	private bool placed = false;
	private Vector3 pos;

	void Start ()
	{
		
	}
	
	void Update ()
	{
		if (placeObjects) {

			if (!created) {
				created = true;
				instantiated = false;
				placed = false;
			}

			Plane plane = new Plane (Vector3.up, new Vector3 (0, 0, 0));
			Ray ray = Camera.main.ScreenPointToRay (Input.mousePosition);
			float dist;

			plane.Raycast (ray, out dist);
			pos = ray.GetPoint (dist);

			if (!instantiated) {
				building = Instantiate (castlePrefab, new Vector3 (pos.x, 0, pos.z), Quaternion.identity) as GameObject;
				instantiated = true;
			}

			if (!placed) {
				building.transform.position = new Vector3 (pos.x, 0, pos.z);
			}

			if (Input.GetMouseButton (0) && !placed) {
				building.transform.position = new Vector3 (pos.x, 0, pos.z);
				placed = true;
				created = false;
				instantiated = false;
				placeObjects = false;
			}
		}
	}
}

Just make a UI canvas with a button that handles the placeObject bool and you are done.
Off course, if you have many buildings, you can add public prefabs (GameObjet) and handle the Instantiate function to select from them.
Hope this helps…