Sobre el dise帽o de un sistema flexible de habilidades de personajes en juegos

El sistema de habilidades del personaje es quiz谩s la flexibilidad m谩s exigente en el juego. Es imposible predecir en la etapa de dise帽o qu茅 hechizos aparecer谩n en la versi贸n final o en actualizaciones posteriores. Esta publicaci贸n ser谩 sobre c贸mo abstraje el proceso de realizar habilidades.

La habilidad en s铆 misma no es m谩s que un conjunto de acciones. La interfaz m铆nima de la habilidad consiste en un m茅todo: "aplicar", pero no es tan simple sobre las dificultades bajo el corte.

imagen

Cada habilidad comienza con una serie de controles para ver si se puede aplicar. Entre ellos se encuentran los ordinarios, como verificar la recarga, la disponibilidad de man谩, verificar la distancia y otros. Ya es evidente aqu铆 que no todas las habilidades necesitan todos los controles. Por ejemplo, hay habilidades aplicadas a cualquier distancia. Es decir, diferentes habilidades requieren diferentes conjuntos de controles antes de la ejecuci贸n. Sin embargo, est谩 claro que muchas de las verificaciones se repetir谩n y, a menudo, muchas habilidades requieren el mismo conjunto de verificaciones.

En total, parte de los controles se repetir谩n l贸gicamente, lo que significa que deben cambiarse seg煤n lo acordado, es decir, inmediatamente en todos los lugares. Adem谩s, los conjuntos de partes de los controles en el caso general ser谩n diferentes.

Si se seleccionan partes de las comprobaciones en objetos separados que implementan una interfaz y se integran en una lista individualmente vinculada, obtenemos una plantilla de cadena de responsabilidades.

imagen

En el caso de una verificaci贸n exitosa en el enlace, la verificaci贸n en el siguiente enlace comenzar谩; si no hay un enlace siguiente, la verificaci贸n completa puede considerarse exitosa. Adem谩s de la verificaci贸n en s铆, el enlace tambi茅n puede contener un controlador de errores. Por ejemplo, si al verificar el man谩, resulta que no es suficiente, entonces el enlace puede notificar al jugador sobre esto.

Usando la cadena de tareas, para la habilidad [Disparo poderoso], podemos insertar f谩cilmente un enlace adicional, verificando si el personaje lleva un arco o un enlace, verificando que el personaje tenga un nivel de salud por debajo del 30%, para la habilidad [Segundo viento].

Retrocedamos y recordemos que hay cadenas de cheques que son iguales para muchas habilidades. Destaquemos la esencia de la solicitud de cumplimiento de habilidades y describamos cada uno de los tipos de cadenas de prueba con su clase.

La solicitud solo se requiere para elaborar una cadena de deberes, lanzarla y cancelarla cuando el jugador da el comando apropiado.

imagen

Ya haremos cadenas en implementaciones de consultas.

Por el momento, ya hemos aprendido c贸mo hacer pruebas flexibles de la capacidad de realizar habilidades. Ahora, en caso de una verificaci贸n exitosa, a煤n es necesario cumplir con la habilidad.

Prefer铆 hacer esto sin cambiar las interfaces, agregando el 煤ltimo enlace siempre exitoso que la habilidad realiza como efecto secundario. Aqu铆 hay un ejemplo de implementaci贸n:

public class TerminalChecker: ICastChecker { CastChecker next { get; set; } ISkill skill; public TerminalChecker(ISkill skill) { this.skill = skill; } public bool check() { skill.cast(); return true; } } 

Esta implementaci贸n nos permite hacer solicitudes asincr贸nicas. Esto es 煤til cuando necesitamos informaci贸n adicional del usuario. Por ejemplo, una habilidad debe aplicarse a un 谩rea que el jugador selecciona con el mouse. Por supuesto, no puedes detener el juego en este momento.

Ahora necesitamos unir las solicitudes con las habilidades. Haremos esto, por supuesto, usando polimorfismo agregando una propiedad a la interfaz de habilidad. En esta etapa, ampliamos la capacidad de esta interfaz:

imagen

Despu茅s de todo el trabajo realizado, pensemos en qu茅 es una habilidad. En la implementaci贸n actual, este es un conjunto de acciones precedidas por una serie de comprobaciones. Tenga en cuenta que a un nivel alto, no dependemos de ninguna manera de la l贸gica espec铆fica del juego. Con la idea inicial de describir el sistema de habilidades aplicado a los hechizos, obtuvimos un sistema que, de acuerdo con ciertas reglas, nos da o no nos permite realizar acciones arbitrarias.

Debido a esta propiedad, este sistema puede describir cualquier modificaci贸n del mundo del juego. Por ejemplo, una transacci贸n de venta o un equipo de construcci贸n de edificios.

Echemos un vistazo a todo en general de nuevo.

imagen

En este ejemplo, una habilidad Sprint es una habilidad normal sin un objetivo; la clase que implementa la solicitud de tales capacidades es NontargetCastRequest, que a su vez forma una cadena de cheques de ManaChecker, CooldownChecker y TerminalChecker.

El c贸digo de llamada no depende de los detalles de la implementaci贸n de este sistema, es decir, no romperemos la l贸gica del juego al agregar o cambiar la habilidad.

Este es el sistema de habilidades de los personajes en una forma m铆nima. Este modelo carece de los medios para alertar el c贸digo de llamada, transferir capacidades a la interfaz de usuario y otros detalles de la vida. Puedes pensar en ellos t煤 mismo.

Source: https://habr.com/ru/post/454876/


All Articles