with unity tutoriales tutorial programming pro learning learn language c# unity3d

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 } }