我有一个球员和一个敌人。当我右击敌人时,他的血量下降,命中率上升。我想让它像当你击中敌人时,文本标签变为可见,当你停止攻击时,它保持可见几秒钟,然后隐藏并将hitcounter设置回0。
这就是我现在所拥有的。

public Text GUIHit;
public int HitCounter = 0;

void OnMouseOver()
{
    if (Input.GetMouseButtonDown(1))
    {
        HitCounter++;
        StartCoroutine(ShowHitCounter(HitCounter.ToString(), 2));
    }
}

IEnumerator ShowHitCounter(string message, float delay)
{
    GUIHit.text = message;
    GUIHit.enabled = true;
    yield return new WaitForSeconds(delay);
    HitCounter = 0;
    GUIHit.enabled = false;
}

结果是它工作了2秒,但是即使我还在攻击它,它也会消失,命中计数器返回到0,协程也不会重置回起点。

最佳答案

让我们分析您的代码:

void OnMouseOver()
{
    if (Input.GetMouseButtonDown(1)) //you get passed that if when you hit first time
    {
        HitCounter++;
        StartCoroutine(ShowHitCounter(HitCounter.ToString(), 2)); //you call your label with delay of 2 sec
    }
}

IEnumerator ShowHitCounter(string message, float delay)
{
    GUIHit.text = message;
    GUIHit.enabled = true;
    yield return new WaitForSeconds(delay); // still on your first hit you get to here and wait 2 seconds
    HitCounter = 0; //after 2 seconds you reset hitcounter and disable label
    GUIHit.enabled = false;
}

要修复它,您需要知道您何时停止点击,然后重置HitCounter并禁用Label。
我将ShowHitCounter更改为以下值:
IEnumerator ShowHitCounter(string message)
{
    GUIHit.text = message;
    GUIHit.enabled = true;
}
void ClearLabel()
{
    HitCounter = 0;
    GUIHit.enabled = false;
}

}
我让clearlabel有单独的方法来清除标签。你的逻辑必须在不同的地方,并调用这个方法。
有一个地方会举办留宿活动。
其他地方会在你的onmouseover中添加一个属性
public static DateTime TimeLeft { get; set; }

void OnMouseOver()
{
    TimeSpan span = DateTime.Now - TimeLeft;
    int ms = (int)span.TotalMilliseconds;
    if (ms > 2000)
    {
        ClearLabel();
    }
    if (Input.GetMouseButtonDown(1))
    {
        HitCounter++;
        StartCoroutine(ShowHitCounter(HitCounter.ToString(), 2));
    }
}

您还需要在之前的某个地方初始化TimeLeft

10-08 20:25