Theme Rent a Car

B

Buenas a todos y gracias por pasaros por aquí.

Prologo


spoiler

Juego Rent A Car


Preguntas y respuestas

spoiler

Modelo de Datos


spoiler

10 - Sept - 2018

Cargado de Datos desde un CSV

spoiler

9 - OCT - 2018

Finite State Machine

Hoy vamos a trabajar en algo más interesante, vamos a crear el FSM para las shuttles o vehículos de transporte de clientes.

Lo importante en este punto es determinar cuáles van a ser los pasos que necesitará la shuttle a lo largo de su recorrido. Por ahora analizaremos los más básicos e iremos añadiendo nuevos que permitan mejorar y profundizar en este apartado (cuando no tenga empleado para conducirse, bloquear al empleado para no ser despedido/ir a descansar durante un trayecto o tarea, etc).

  • La shuttle tendrá un periodo de reposo a la espera de llegada de clientes
  • Conduciendo desde un punto a otro
  • Esperando en parada de clientes recogiendo a estos o dejándolos en la oficina.

Creamos el controlador de las Shuttle que permitirá administrar todos los datos de estas y poder ser usados en nuestros estados.

public class ShuttleController : StateMachine {

public Transform officeStop;
public Transform clientsStop;
public float timeReset = 5f;
public NavMeshAgent agent;
public PositionCar positionCar;


[HideInInspector] public int slotSeats = 8;

private void Start()
{
    ChangeState<InitShuttleState>();
}
}

Por ahora tendremos controladas las 2 paradas, tiempo de espera que usaremos como referencia, NavMeshAgent para poder mover el vehículo y posición del coche hasta ese momento (lo usaremos para que una vez habilitada la función de seleccionar el vehículo, podamos ver en que estado se encuentra).

Añadimos número de asientos.

Para crear el FSM, necesitamos la estructura que hará que nuestro StateMachine funcione. Será necesario crear nuestros Estado Base del cual heredarán el resto de los Estados de nuestro vehículo.

public class ShuttleState : State {

protected ShuttleController owner;

public Transform officeStop { get { return owner.officeStop; } }
public Transform clientsStop { get { return owner.clientsStop; } }
public float timeReset { get { return owner.timeReset; } }
public PositionCar positionCar { get { return owner.positionCar; } }
public int slotSeats { get { return owner.slotSteats; } }
public NavMeshAgent agent { get { return owner.agent; } }



protected virtual void Awake()
{
    owner = GetComponent<ShuttleController>();
}
}

Creamos una referencia a la controladora de la Shuttle de manera Protected, así podremos acceder a los datos de la controladora desde States que hereden de ShuttleState. Mismo proceso para los métodos.

Ahora procedemos a añadir los estados por los que pasará la shuttle durante su trabajo

public class InitShuttleState : ShuttleState {

public override void Enter()
{
    base.Enter();
    StartCoroutine(Init());

}

IEnumerator Init()
{
    yield return null;
    owner.positionCar = PositionCar.Parking;
    owner.ChangeState<WaitShuttleState>();
}
}

Como podemos apreciar, realizamos un override en la función Enter() para poder incluir la coroutine que dará paso al siguiente estado. He incluido este estado vacío por así decirlo ya que será el que nos permita crear las shuttle desde cero una vez las compremos y tengamos que instanciarlas, además de incluir y hacer referencia a datos necesarios para el futuro.

public class WaitShuttleState : ShuttleState {

protected override void AddListeners()
{
    base.AddListeners();
    this.AddObserver(OnClientWaitingStop, ClientsActions.ClientsWaitStop);
}

protected override void RemoveListeners()
{
    base.RemoveListeners();
    this.RemoveObserver(OnClientWaitingStop, ClientsActions.ClientsWaitStop);
}

private void OnClientWaitingStop(object sender, object args)
{
    owner.positionCar = PositionCar.Moving;
    owner.ChangeState<MovingToClientStopState>();
    
}


}

Para este estado, añadimos 2 listeners u observadores. Lo que estarán observando será que un cliente o varios aparezcan en la parada y la shuttle vaya a recogerlos. Es el único estado que tendrá estos Observadores. El motivo es que el único momento en el que nos interesa ver que hay clientes, es cuando el vehículo se encuentra estacionado en nuestras oficinas. No queremos que el vehículo salga de recoger clientes y se vuelva a la parada justo en mitad del camino.

public class ClientsActions : MonoBehaviour {

public const string ClientsWaitStop = "ClientsActions.ClientsWaitStop";

public void ClientAreWaiting()
{
    this.PostNotification(ClientsWaitStop);
}
}

ClientsActions contendrá las acciones que realizarán los clientes una vez se creen en la parada, lleguen a nuestra oficina y/o acaben su relación comercial con nosotros.

public class MovingToClientStopState : ShuttleState
{
    bool hasStopped = false;

public override void Enter()
{
    base.Enter();
    MovingTo();
   
}

public override void Exit()
{
    base.Exit();
    hasStopped = false;
}

void MovingTo()
{
    agent.SetDestination(clientsStop.position);
    StartCoroutine(StartMoving());
}
IEnumerator StartMoving()
{
    while (!CheckPosition())
    {
        yield return new WaitForSeconds(1f);
    }
    owner.positionCar = PositionCar.Parking;
   
    owner.ChangeState<ReceiveClientsState>();
}

bool CheckPosition()
{
    if(!agent.pathPending)
    {
        if (agent.remainingDistance <= agent.stoppingDistance)
        {
            if (!agent.hasPath || agent.velocity.sqrMagnitude == 0f)
            {
                hasStopped = !hasStopped;
            }
        }
    }
    return hasStopped;
}
}

Tenemos la variable hasStopped para comprobar si el vehículo se ha detenido en la parada o si aun sigue en marcha hacia su destino. Lo conseguimos comprobando si no está pendiente de otra ruta, si la distancia entre el vehículo y la parada es menor, si no tiene una ruta establecida o si su velocidad es 0. Si todo esto pasa el visto bueno, se cambia su valor a true y se relanza la coroutine y el siguiente estado.

public class ReceiveClientsState : ShuttleState {

float timeWait = 0;

public override void Enter()
{
   
    base.Enter();
    
    StartCoroutine(MovingToOffce());
    
}

public override void Exit()
{
    base.Exit();
    timeWait = 0;
 
}

IEnumerator MovingToOffce()
{
    
    while (timeWait <= owner.timeReset)
    {
        
        yield return new WaitForSeconds(1f);
        timeWait++;
         }
    owner.positionCar = PositionCar.Moving;
    yield return new WaitForSeconds(1f);
    owner.ChangeState<MovingToOfficeStopState>();
    

}
}

Por ahora marcamos un tiempo fijo, en su debido momento, se creará aquí un delegate que será el de recogida de clientes, estos activarán los observadores y se añadirán a la cola de clientes. En este momento, se añadirán a un array de clientes y se reducirá su número del slots de cada vehículo. Si pasado el tiempo Reset, nadie se ha subido, la shuttle se marchará, que es lo que realiza en este momento.

MovingToOfficeStopState es igual que MovingToClientStopState salvo que se dirige a una posición u a otra dependiendo de donde se encuentre. Será modificado en el siguiente avance.

Con esto, tenemos un vehículo que espera en la parada de la oficina, que recibe la llamada de un cliente o de varios, se dirige al punto de encuentro y vuelve.


Versión 0.4 - Creación del FSM para las shuttle.
Versión 0.3 - Introducimos la herramienta para cargar datos desde archivos CSV y su actualización automática.
Versión 0.2 - Preparamos lo que es el sistema de carga y salvado del juego.
Versión 0.1 - Analizamos los requisitos necesarios para hacer el proyecto y creamos aquellas clases que serán las principales.

12
B

Reservado

B

reservado

B

Reservado

Jastro

Pinta bien! queremos capturas y muchos guiris borrachos rompiendo coches!

1 respuesta
pirri1721

Enorme post, en favs ya mismo :+1:

Karedel

Por favor metele una mazmorra donde poder encerrar a la peña que jode el coche

2
totespare

Leído y a favoritos. Y suscribo a #5 , fotos fotos fotos!

Ánimo y a darle duro!

Ridote

Yo ando haciendo algo similar, te seguiré de cerca!

B

En principio voy a utilizar este asset que compré en su día pero que no le he dado mucho uso

Más las casas que vienen pues podré hacer lo que es el parking, carreteras y trayectos de los vehículos. Pero ya la siguiente info será la semana que viene :D

8 1 respuesta
totespare

#10 pues unos assets mu chulos, definidos y limpitos, molan!

1
Pinchejotron

quiero alquilar un lamborghini pero de 49cc sin carnet

logandevil

Sé que no tengo ni puta de programación, pero he trabajado de dos años en la industria del rent a car, ocupando puestos de responsabilidad. Si tienes alguna duda, me dices.

1
D90

Pillo BetaTesteo

_Rpv

¿para que plataforma será?
yo lo quiero jugar.

Aidanciyo

Yo haría una especie de papers please con coches xD

domi8410

No sabia ni que habia un subforo acerca del desarrollo de videojuegos. Leido y muy muy interesante, espero que el desarrollo vaya bien y vayas actualizando. Suerte!

1 respuesta
B

Pon que las tías abollen más los coches aparcando. Saldrás en las noticias como juego machista pero tendrás publicidad gratis.

1
ArKan0iD

#17 no se si la idea que tiene es hacerlo realista...

danidetania

que buena pinta, a favs directo para seguir el desarrollo

IvAnChU

Buena pinta con las ideas.
yo añadiria a eso que llamas "campa" un modelo de mejora para el parking, estilo ir añadiendo niveles por ejemplo al contratar un securata para vigilar esos coches, primero contratas un jonki y acabas con prosegur vigilandotelo, yo kse xD
-seguridad
-cercado con vallas
-suelo de tierra luego grava.. enfin cemento ya sabemos xd
-ampliar parking para meter mas coches
-parking cerrado o abierto
-puertas manuales/automaticas segun se avanze...
enfin nose xD suerte con el proyecto!

B

Buenas a todos! La idea no es crear un juego completo sino ir detallando los avances para la creación del este, como ir desarrollando las clases, scripts e interfaces de cara a hacer una versión jugable de un nivel con sus mejoras.
Durante este proceso, se verá como decisiones que en su día fueron tomadas han de ser modificadas y adaptadas a los nuevos cambios y sobretodo, intentar que el juego sea escalable de cara a aplicar futuras actualizaciones.

La intención será:

  • Contratar personal
  • Comprar coches
  • Ver los coches moverse por el mapa
  • Clientes aparecer, alquilar o entregar los coches
  • Gestionar la economía y estadísticas
  • Ganar reviews positivos para aumentar clientes
  • Desbloquear más categorías/modelos de coche

Con esto sería suficiente para tener algo jugable.

1
7 días después
_Rpv

Update?

B

Hoy ha sido un pequeño update. Se ha incluido un sistema de guardado que a la postre nos servirá para que el jugador guarde y/o cargue sus partidas.

En el siguiente update se implementará la creación aleatoria de nombres para ser usados tanto nuestros clientes como empleados.

También crearemos listados para guardar la información de estos y poder guardarlos en nuestro savedata

12 días después
kesada7

Me he encontrado esto por twitter y me he acordado de este proyecto, aunque bueno ya tenías tus modelos 3D lo dejo de todas formas por si en el futuro quieres ampliar o te gustan, por 13 dolares me parece muy buen precio por todos los que traen.

totespare

Si los quieres low poly, los de kenney te pueden servir de puta madre. Echale un ojo aquí https://www.kenney.nl

1 respuesta
B

#26 El de los emotes me viene perfecto para representar el estado de animo de clientes/trabajadores.

2 respuestas
txandy

#27 Yo tengo los 3 packs y la verdad es que están muy bien. 100% recomendado.

totespare

#27 también tiene una aplicación para modelar en low poly tipo minecraft y exportar a fbx y tal, está bastante chula y no es muy cara (como 25€ creo).

18 días después
Jastro

@yukikaze actualiza, primer aviso.

10