UnityCity - Diario de desarrollo

13500

"Tras el fiasco de mi primer alpha [///], y a pesar de tener menos tiempo que un reloj sin pilas, me embarco en un nuevo proyecto para Unity."

PRÓLOGO

Harto de modernas versiones de creadores y gestores de ciudades (como SimCity 2013, Cities XL...), juegos de complejidad extrema (o absolutamente todo lo contrario), mal rendimiento, y acabado tosco o insatisfactorio; me propongo hacer un proyecto que recoja la esencia de auténticos clásicos en lo que a gestión urbanística se refiere (véase Caesar, Pharaoh, o el glorioso SimCity 4).

Para comenzar, estudio una serie de requisitos que detallaré más adelante en la ficha informativa UnityCity, comenzando por lo más básico: la colocación de 'props' y edificios.

Para ello, me he decantado por el estilo clásico de los juegos anteriormente mencionados, dividiendo el escenario en un grid de cuadrados, con una cámara isométrica (giratoria 360º); y evitando dejar esos tan incómodos huecos vacíos.

Que dé comienzo el diario de desarrollo de 'UnityCity'!

SCREENSHOTS







20
13500

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!!)

3 1 respuesta
Aidanciyo

Mucha suerte, va a ser el trabajo de tu vida.

2
mr_badger

Joder como salga bien este proyecto te coronas. Si has empezado hoy me sorprende la cantidad de trabajo que has hecho.

Abandonas definitivamente el anterior? creia que le darias una vuelta de tuerca

1 respuesta
13500

#4 no lo abandono, pero me refresco un poco empezando otro proyecto con una perspectiva radicalmente distinta

realmente me ha costado más tiempo y trabajo documentarlo y grabar los .gif, que el código xD

1
I

Vamos! de aqui dos dias vemos tu juego posteado en Juegos indies de gestion #HO

2
Selbryn

#1 Me mola la idea, tengo en mente hacer algo así algún dia... con tiempo xD

https://twitter.com/FuriousGamer87/status/444784316589961216/photo/1/large

Mírate esa imagen que lo mismo te sirve de inspiración

1
B

Me encanta, fav y suerte

1
Drhaegar

Échale un ojo a LinCity, básicamente es un Simcity de código libre para Linux. Quizá puedas aprovechar algo.

1
YaW

Hay que estar loco para meterse en algo así, es un curro de cojones :D

Mucha suerte y sigue actualizando esto que me mola mucho como pones los updates de lo que vas haciendo y tal

1
_dGr_

Me encanta!! Suerte y al toro!!

1
GreyShock

Joder cuanta energía! Me has animado el día al ver que no solo no te rindes si no que pisas a fondo tras [///]. ¡¡¡¡MUCHO ÁNIMO!!!!

1
Galbix

#1 El último gif mola demasiado. Expectante me hallo.

1
Encofrado

#1 Dios dios dios un Simcity echo por un media-videro! no decaigas que esta muy bien todo lo enseñado!

2
larkkkattack

hazlo de annunakis colonizadores, como un startopia in da earth

SeiYa

Genial, me encanta :)

1 mes después
Selbryn

Como va estoo?? :D

1 respuesta
JackSparow

Mucho ánimo!

Lo que los edificios caigan al suelo, es simplemente porque tienen un rigidbody y caen por la gravedad no? Merci.

Comentario: Prueba de instanciar una matriz del suelo 100x100 por ejemplo.
Tengo el feeling que tendrás un error de rendimiento con tantas "losas" instanciadas.
Obviamente, tener las losas por separado te da ciertas ventajas para la implementación también claro. Tengo curiosidad de lo que te comento xD

1 respuesta
13500

#17 paradillo, estoy mucho más avanzado con [///] 2.0

#18
Si, hasta que 'tocan' el suelo.

Hice la prueba con 512x512 losas y, después de un pequeño lapsus de carga un poco más grande (2-3seg), el rendimiento a la hora de colocar el .prefab del edificio es idéntico.

2 respuestas
karlozalb

meee encantan estos juegos!! que currazo te vas a meter

"shut up and take my money!!!"

1 respuesta
Clinisvud

#19 ¿Eso es JavaScript? ¿Qué haría falta para aprender a hacer eso? Estoy aprendiendo a programar en Scheme para ir cogiendo base, pero no tengo ningún proyecto en mente al que orientarme, y hacer algo así estaría muy guapo.

1 respuesta
JackSparow

#19 No lo digo por los lapsus de carga, lo digo por los fps que puedas tener con tal cantidad de losas instanciadas. (una gran cantidad de draw calls).

Te lo digo porque yo un día me dio por empezar una especie de Minecraft, y tenia ese problema de rendimiento que no sabía como resolverlo.

edit: Posiblemente también, en vez de que las losas sean cubos, deberían ser planos.

1 respuesta
13500

#20 muchas gracias!

#21 el código es C# (C sharp). No conozco Scheme. Te recomiendo que como algo muy muy básico, aprendas a programar en C, y de ahí pases a cualquier lenguaje orientado a objetos: Java , C++ , C#.

#22 depende de la estética que se le quiera dar al volumen del terreno (colinas, valles, costas...)

2
11 días después
Peilo

¿Cómo va el proyecto ahora, sigue en pie?

4 1 respuesta
Aidanciyo

Solo pensar en algo asi me mareo XD

13500

#24 por supuesto sigue en pie, aunque no al ritmo que me gustaría.

Como ya conté en otro thread, trabajo como programador web de 09:00 a 18:00 de L-V, lo que sumando las tareas y responsabilidades domésticas que suponen vivir sólo, y las necesidades de socialización; me queda poco tiempo para dedicarlo a programar videojuegos.

No me gustaría que sonara como excusa, sino más bien como quejido al viento de que, quizás algún día me decida por dar el valiente paso de dedicar el 99% de mi tiempo a los videojuegos dejando otras cosas de lado.

Pero por ahora, y cerrando esta parábola, tanto este proyecto como [///] 2.0 siguen en pie, aunque poquito a poco.

5 1 respuesta
karlozalb

#26 lo importante es seguir, aunque sea despacio. Si tienes sustento para vivir mientras tanto pues más tiempo tienes para pulir el juego al máximo y que llame lo suficiente la atención como para quitarte de currar :)

2
MrPacoPorras

ole!!! que crack! :)

MaikelOrtega

Tiene pintaca, ¡ánimo!

9 días después
13500

Actualizo con una mini feature que añadí hace 1 mes o así, por darle algo de vidilla al hilo:

Luz según hora del día

Segundos reales = 10 minutos en el juego
2,4 minutos reales = 1 día en el juego
1,2 horas de partida = 1 mes en el juego

(el video esta a baja calidad y acelerado 64x)

2