- Home /
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");
}
}
}
Answer by dazdspaz · Mar 16, 2012 at 02:21 PM
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
If I get it going i'll post it here. Trying to change the mouse cursor into a dummy of the object for placement of the building only then it would turn back but so far cursor just disappears. Since I've already failed at instantiating a dummy object which would follow the mouse position and then delete on placement of the actual object
Hi all, here is a link to a tutorial and demo project it is in c# but has the elements that you are looking for. I hope this helps! link text
Answer by Endico · Dec 12, 2016 at 08:29 AM
Try using the transform position and rotation of the refrence object
Answer by areFranz · Jul 23, 2017 at 04:53 PM
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...
Your answer
Follow this Question
Related Questions
Can someone help me fix my Javascript for Flickering Light? 6 Answers
Setting Scroll View Width GUILayout 1 Answer
rts building placement 1 Answer
Main menu help (javascript) 1 Answer
3D Menu Help 1 Answer