我有一个球员和一个敌人。当我右击敌人时,他的血量下降,命中率上升。我想让它像当你击中敌人时,文本标签变为可见,当你停止攻击时,它保持可见几秒钟,然后隐藏并将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
。