Передайте значение SkillCoolDown методу в качестве уникального параметра - PullRequest
0 голосов
/ 03 апреля 2020

У меня есть базовый класс навыков и 2 отдельных класса навыков, которые наследуются от класса навыков. Каждый навык имеет свое значение SkillCoolDown. Я установил класс CoolDownManager, который отображает время восстановления навыков, но я не понимаю, как установить значение SkillCoolDown для менеджера, которое отличается для каждого навыка. Буду признателен за помощь.

public class Skill
{
    private string skillName;
    private int skillDamage;
    private string skillDescription;
    private int skillCoolDown;

    public string SkillName {get;set;}
    public int SkillDamage {get;set;}
    public string SkillDescription {get;set;}
    public int SkillCoolDown {get;set;}
    public Skill () {}
} 
public class CoolDownManager : MonoBehaviour
{
    public Skill skill;
    private Stopwatch cooldown;
    private Button button;
    private Image fillImage;
    private int skillCoolDown;


    public void OnSkillUse(Button btn) {

        skill = new Skill();  // HERE THE VALUE SkillCoolDown SHOULD BE IMPLEMENTED AND I WANT SOMEHOW TO SHOW WHICH SKILL HAS BEEN USED.

        button = btn.GetComponent<Button>();
        fillImage = btn.transform.GetChild(0).gameObject.GetComponent<Image>();
        btn.interactable = false;
        fillImage.fillAmount = 1;
        cooldown = new Stopwatch();
        cooldown.Start();
        StartCoroutine(CoolDownAnimation());
    }


    private IEnumerator CoolDownAnimation() {
        while(cooldown.IsRunning && cooldown.Elapsed.TotalSeconds < skill.SkillCoolDown) {
            fillImage.fillAmount = ((float)cooldown.Elapsed.TotalSeconds / skill.SkillCoolDown);
            yield return null; 
        }

        fillImage.fillAmount = 0;
        button.interactable = true;
        cooldown.Stop();
        cooldown.Reset();
    }
}

А вот пример класса Skill, из которого следует передать значение SkillCoolDown.

public class BasicAttack : Skill
{
    public BasicAttack() 
    {
        SkillCoolDown = 2;
    }
}

Ответы [ 2 ]

0 голосов
/ 12 апреля 2020

Это идеальная проблема для решения с использованием объектов с возможностью создания сценариев .

Следующий класс наследует от ScriptableObject и определяет те же данные, что и ваши классы Skill. Используя атрибут CreateAssetMenu для этого класса, вы можете создать новый актив этого типа. Щелкните правой кнопкой мыши в окне своего проекта и перейдите к пункту меню Combat/Skills/New Skill, после чего у вас будет актив этого типа.

Примечание. Поскольку это актив, он неявно имеет свойство name. Таким образом, вы можете назвать Skill актив соответствующим образом.

[CreateAssetMenu(fileName = "NewSkill.asset", menuName = "Combat/Skills/New Skill")]
public class Skill : ScriptableObject
{
    [SerializeField] private int _damage = default;
    [SerializeField] private string _description = default;
    [SerializeField] private int _cooldown = default;

    public int damage => _damage;

    public string description => _description;

    public int cooldown => _cooldown;
}

Теперь, когда вы можете создать Skill активов, go вперед и создать два ваших навыка и заполнить детали в инспекторе.

Далее вам понадобится способ использования Skill. Я избавился от CoolDownManager в пользу кнопки. Проверьте следующее.

[RequireComponent(typeof(Button))]
public class SkillButton : MonoBehaviour
{
    [SerializeField] private Skill _skill = default;
    [SerializeField] private Button _button = default;
    [SerializeField] private Image _fillImage = default;

    private Stopwatch _stopwatch = new Stopwatch();

    private void Awake()
    {
        // Hook up a method to listen for when the button is clicked.
        _button.onClick.AddListener(OnClick);
    }

    // This method is invoked when the button is clicked.
    private void OnClick()
    {
        StartCoroutine(CoolDownAnimation());
    }

    private IEnumerator CoolDownAnimation()
    {
        // Immediately keep the button from being clicked again.
        _button.interactable = false;
        _stopwatch.Start();

        while (_stopwatch.IsRunning && _stopwatch.Elapsed.TotalSeconds < _skill.cooldown)
        {
            _fillImage.fillAmount = (float)_stopwatch.Elapsed.TotalSeconds / _skill.cooldown;
            yield return null;
        }

        _fillImage.fillAmount = 0;
        _button.interactable = true;
        _stopwatch.Stop();
        _stopwatch.Reset();
    }

    // Use this to hook up references automatically.
    private void OnValidate()
    {
        if (_button == null)
        {
            _button = GetComponent<Button>();
        }

        if (_button != null && _fillImage == null)
        {
            _fillImage = _button.transform.GetChild(0).gameObject.GetComponent<Image>();
        }
    }
}

Прикрепите компонент SkillButton к Button вам или sh, чтобы иметь контроль над умением, затем подключите различные объекты Skill, чтобы они были связаны с эта кнопка.

При всем этом у вас должна быть функциональность, близкая к тому, что вы хотите.

0 голосов
/ 04 апреля 2020

A Skill может быть передано CooldownManager с помощью инжектора конструктора:

public class CoolDownManager : MonoBehaviour 
{ 
   public Skill skill;
   // other properties

   public CoolDownManager(Skill skillParam)
   {
      skill = skillParam;
   }

   // do whatever you want with skill
}
...