多个对象同时使用一个对象的同步问题
发表于2017-12-01
写了段代码,主要部分如下:
public void OnMouseOver() { hovering = true; //使用 } public void OnMouseExit() { hovering = false; } <pre name="code" class="csharp"> oid Update() { if (hovering) { CreatureManager.Instance.ShowCreatureDes(thisGrid.itemId); DetectUse(); } else if (!hovering) { CreatureManager.Instance.HideCreatureDes(); } }
主要功能是如果鼠标移到物品格子上面就显示一个介绍的NGUI文本。
文本是作为单例模式的对象的一个方法,当鼠标移动到上面的时候就显示,否则不显示。这个时候问题来了,当你一个格子发出通知需要显示的时候,另外的格子都没有检测到鼠标,于是发出通知将NGUI文本屏蔽,显示与屏蔽的需求共存,于是NGUI文本显示就不正常了。想到了以前JAVA的线程同步处理方法,这应该是一个解决方案,但是过去太久要复习,还要重看C#的线程处理。
于是又想起另外一个解决方法:加了一个变量everHovered,表示这个物品格子鼠标曾经滑过上去,然后只有曾经划过的格子才有资格将NGUI文本屏蔽,
主要代码如下:
public void OnMouseOver() { hovering = true; //使用 everHovered = true; } public void OnMouseExit() { hovering = false; StartCoroutine(ResetEverHovered()); } IEnumerator ResetEverHovered() { yield return new WaitForSeconds(0.1f); everHovered = false; }
<pre name="code" class="csharp"> void Update() { if (hovering) { CreatureManager.Instance.ShowCreatureDes(thisGrid.itemId); DetectUse(); } else if (!hovering&&everHovered) { CreatureManager.Instance.HideCreatureDes(); } }