PLWO
PLWO

Reputation: 57

Cool down function for skill button in mobile game

I want to include a cool down function to my skill button in my mobile game that I am currently developing. So I wanted to allow the player to only be able to use the skill button once every few seconds.

Left button is my default skill button and right one is a duplicate. The default skill button will be placed over the duplicate so when I run the game, upon clicking on the default skill button, the duplicate will overlap the default skill button.

Skill Button Comparison

However, in my case the duplicate is not able to overlap the default skill button so it does not show the cool down timer.

I am wondering if I need to include a set of codes to allow the default skill button to turn inactive upon clicking or do I just have to sort the layers?

My current codes are as such:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class Abilities : MonoBehaviour
{
public Image abilityImage1;
public float cooldown = 5;
bool isCooldown = false;
public Button ability1;

void Start()
{
    abilityImage1.fillAmount = 0;
    ability1.onClick.AddListener(AbilityUsed);
}

private void AbilityUsed()
{
    if (isCooldown)
        return;
    isCooldown = true;
    abilityImage1.fillAmount = 1;
    StartCoroutine(LerpCooldownValue());
}

private IEnumerator LerpCooldownValue()
{
    float currentTime = 0;
    while (currentTime < cooldown)
    {
        abilityImage1.fillAmount = Mathf.Lerp(1, 0, currentTime / 
 cooldown);
        currentTime += Time.deltaTime;
        yield return null;
    }
    abilityImage1.fillAmount = 0;
    isCooldown = false;
}
}

The first picture is my original skill button and on the bottom is a duplicate which I made to adjust the color to create an overlay effect for the cool down.

Skill Button Skill button 1 Code Inspector

Thanks!

Upvotes: 0

Views: 873

Answers (1)

Nikolay Gonza
Nikolay Gonza

Reputation: 613

Use Lerp instead of changing fill amount in Update() method

void Start()
{
    abilityImage1.fillAmount = 0;
    ability1.onClick.AddListener(AbilityUsed);
}

private void AbilityUsed()
{
    if (isCooldown)
        return;
    isCooldown = true;
    abilityImage1.fillAmount = 1;
    StartCoroutine(LerpCooldownValue());
}

private IEnumerator LerpCooldownValue()
{
    float currentTime = 0;
    while (currentTime < cooldown)
    {
        abilityImage1.fillAmount = Mathf.Lerp(1, 0, currentTime / cooldown);
        currentTime += Time.deltaTime;
        yield return null;
    }
    abilityImage1.fillAmount = 0;
    isCooldown = false;
}

Upvotes: 1

Related Questions