2015-04-03 35 views
1

检测按钮OnClick事件非常容易,但我无法弄清楚如何检测使用何时开始和停止触摸按钮。如何才能做到这一点?如何知道用户何时持有UI按钮?

这就是我想现在:

public class Touching : MonoBehaviour { 
    public static bool mouseDown; 
    public float timeMouseDown; 

    void Update(){ 
     if (mouseDown) { 
      timeMouseDown += 1; 
      Debug.Log ("meditar"); 
     } 
    } 

    public void OnPointerDown(PointerEventData eventData){ 
     Debug.Log ("OnPointerDown"); 
     mouseDown = true; 
    } 

    public void OnPointerUp(PointerEventData eventData){ 
     Debug.Log ("OnPointerUp"); 
     mouseDown = false; 
     timeMouseDown = 0; 
    } 
} 

回答

3

您需要3个变量:一个boolean(你已经有了),一个DateTime(用户点击该按钮的那一刻)和TimeSpan(点击持续时间)。

boolean mouseDown; 
DateTime startTime; 
TimeSpan clickDuration; 

public void OnPointerDown(PointerEventData eventData){ 
    Debug.Log ("OnPointerDown"); 
    mouseDown = true; 
    startTime = DateTime.Now; 
} 

public void OnPointerUp(PointerEventData eventData){ 
    Debug.Log ("OnPointerUp"); 
    mouseDown = false; 
    clickDuration = DateTime.Now - startTime; 
} 

由于Huacanacha暗示,它可能会更快,而不是使用通用DateTimeTimeSpan统一的具体Time功能。你可以尝试两种方法,并衡量对性能的影响。

+1

'DateTime'和'TimeSpan'是不必要的重量级这里,他们不直接相关的游戏时间(思考时间。 timeScale!= 1,认为需要将按钮按下/释放时间与游戏事件联系起来)。最好在相应的事件中简单地使用'float startTime'和'float endTime'将它们设置为'Time.time'。 Delta时间当然是'endTime-StartTime'。 – Huacanacha 2015-04-04 07:08:06

-1

你可以在mousedown上启动一个线程,然后告诉线程在mouseup停止。这将保持表单的响应。 这将是这个样子:

using System.threading 
class my class 
{ 

private thread thread0(functiontoloop); 

mousedownevent 
{ 
    thread0.start(); 
} 

private void funtiontoloop() 
{ 
    do something here 
} 


mouseupevent 
{ 
    thread0.Abort(); 
// or u could use 
thread0.suspend(); // that way you could resume if needed 

} 
} 

,并使用它:

using System.Threading; 
Thread t; 
private void btn_Xmas_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e) 
{ 
     ThreadStart del=new ThreadStart(dothis); 
     t=new Thread(del); 
    t.Start(); 
} 

private void btn_Xmas_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e) 
{ 
    t.Abort(); 
} 
public void dothis() 
{ 
    while(true) 
    { 
       this.x=this.x+10;  
                   this.crimsonModel.writeStringToAll("newX:"+x.ToString()); 
     } 
} 
相关问题