DIA I - ESCENARIO
Comienzo detallando el sistema de colocación de objetos (o 'props' ) en el escenario.
Comenzando por tener un grid como base de escenario, me he decantado por auto-generar una serie de minicubos prefabricados de tamaño (1, 0.25, 1) llamados "losa" con la siguiente textura:
Los "instancio" a partir de las coordenadas (0, 0, 0) con un script muy simple:
private int x,y = 0;
// Use this for initialization
void Start () {
losa_suelo = Resources.Load("losa", typeof(GameObject));
for(x=0;x<3;x++){
for(y=0;y<3;y++){
GameObject new_losa = Instantiate (losa_suelo, new Vector3(x, 0, y), Quaternion.identity) as GameObject;
}
}
}
Y obtengo esto:
Ya tengo preparado un pequeño "grid" donde poder trastear con edificios, calles, etc...
Ahora, creo un .prefab con un par de cubos, que simulen una comisaria (o un hospital, o un colegio, o whatever...) al que llamo "edif_Test", con un tamaño total máximo de (1, y, 1), con y un valor cualquiera (ya que es la altura del edficio).
Este prefab deberá anclarse a la casilla del suelo al hacer click sobre la misma. Para ello, hago uso de los famosos Raycast
Creo otro script con el siguiente código:
RaycastHit vHit;
Ray vRay;
Object edif;
Vector3 position_Click;
// Use this for initialization
void Start () {
vHit = new RaycastHit();
edif = Resources.Load("prefab_edificio/test/edif_Test", typeof(GameObject));
}//end start
// Update is called once per frame
void Update () {
vRay = Camera.main.ScreenPointToRay(Input.mousePosition);
if(Physics.Raycast(vRay, out vHit)){
Debug.DrawRay(vRay.origin, vRay.direction * 20, Color.red);
}
position_Click.x = vHit.collider.gameObject.transform.position.x;
position_Click.z = vHit.collider.gameObject.transform.position.z;
if(Input.GetMouseButtonDown(0)){
GameObject edifGO = Instantiate(edif, new Vector3(position_Click.x,1.65f,position_Click.z), Quaternion.identity) as GameObject;
}
}//end update
En este código preparo el típico Ray y RaycastHit para detectar dónde hago click. Al comenzar, cargo como recurso el prefab previamente creado del edificio en cuestión.
Mediante el método Camera.main.ScreenPointToRay(Input.mousePosition); lanzo un raycast desde la posición del ratón hacia la dirección en la que mira en la cámara. De este modo, con la cámara en modo Ortographic, donde pongo el puntero es donde pongo el edificio.
En caso de que el Raycast detecte físicas (en este caso, el grid del mapa), mediante el método Debug.DrawRay, puedo comprobar como efectivamente, la posición del puntero coincide con el lugar que señalo (aunque no se aprecia demasiado, el Debug.DrawRay es la delgada línea roja [peliculón!])
Al definir
position_Click.x = vHit.collider.gameObject.transform.position.x;
position_Click.z = vHit.collider.gameObject.transform.position.z;
, lo que estoy haciendo es obtener las coordenadas 'x' y 'z' del centro del cuadradito del grid; de modo que al instanciar el edificio; éste aparezca justo en el centro del cuadrado.
Ya sólo queda entonces que, al hacer click, aparezca el dichoso edificio, en la posición definida:
if(Input.GetMouseButtonDown(0)){
GameObject edifGO = Instantiate(edif, new Vector3(position_Click.x,1.65f,position_Click.z), Quaternion.identity) as GameObject;
}
Simple, rápido y eficaz. Ya tengo la base de UnityCity <- (toma spam ahi de mi blog!!)