Это идеальная проблема для решения с использованием объектов с возможностью создания сценариев .
Следующий класс наследует от 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
, чтобы они были связаны с эта кнопка.
При всем этом у вас должна быть функциональность, близкая к тому, что вы хотите.