c# - tutoriales - unity programming language
creando objetos de habilidad en la Unidad (2)
al elegir un personaje, actualmente tengo una clase base
abstract class CharacterClass
{
public abstract void AbilityOne();
public abstract void AbilityTwo();
}
Y mis personajes se derivan de esta clase
class Warrior : CharacterClass
{
public override void AbilityOne()
{
// implement ability one here
}
public override void AbilityTwo()
{
// implement ability two here
}
}
Por último, uso este código para seleccionar el Guerrero
CharacterClass selectedClass = new Warrior(); // start the game as a Warrior
Así que esta forma funciona bastante bien. Pero cuando se trata de enfriamientos, etc., quiero quedarme con un código limpio, así que pensé en crear una clase de Ability
.
Mi clase de padres abstracta
abstract class CharacterClass
{
public Ability AbilityOne { get; set; }
public Ability AbilityTwo { get; set; }
}
La clase de Guerrero
class Warrior : CharacterClass
{
public Warrior()
{
// Set the new Abilities
AbilityOne = new Ability(3, Smash()); // pass in the method as a parameter ??
AbilityTwo = new Ability(7, Shieldblock());
}
private void Smash()
{
// Ability 1
}
private void ShieldBlock()
{
// Ability 2
}
}
Y mi clase de habilidad
class Ability
{
public Ability(int cooldown, [the ability method here])
{
CoolDown = cooldown;
TheAbility = ? the ability parameter ?
}
public int CoolDown { get; set; }
public void TheAbility(){}
}
Entonces el guerrero pasará en sus dos habilidades y creará dos objetos de habilidad. En el juego podría escribir
CharacterClass selectedClass = new Warrior();
selectedClass.AbilityOne();
y esto daría lugar a un gran éxito con un tiempo de reutilización de 3 segundos. ¿Es esto posible de implementar ... de alguna manera ...?
Como AbilityOne
devuelve un objeto Ability
, tendría sentido crear la infraestructura dentro de la clase Ability
que maneje la lógica diferente que una habilidad podría tener, por ejemplo, ejecutando el reloj en el temporizador de enfriamiento con algún método Update()
, usando la habilidad, etc.
Entonces, el código para llamar a tu habilidad sería algo así como:
selectedClass.AbilityOne.Trigger();
También tendría sentido almacenar el método de habilidad como un System.Action
dentro de tu clase de habilidad.
class Ability
{
public Ability(int cooldown, System.Action _abilityMethod)
{
CoolDown = cooldown;
abilityMethod = _abilityMethod;
}
public int CoolDown { get; set; }
public void Trigger()
{
if( abilityMethod != null )
{
abilityMethod();
}
}
private System.Action abilityMethod;
}
Deberías poder hacer algo como esto:
class Ability
{
public Ability(int cooldown, Action ab)
{
CoolDown = cooldown;
TheAbility = ab;
}
public int CoolDown { get; set; }
public Action TheAbility;
}
class Warrior : CharacterClass
{
public Warrior()
{
// Set the new Abilities
AbilityOne = new Ability(3, Smash);
AbilityTwo = new Ability(7, ShieldBlock);
AbilityOne.TheAbility(); // Will run Smash() method
}
private void Smash()
{
// Ability 1
}
private void ShieldBlock()
{
// Ability 2
}
}