如何在OnMouseUp事件中等待几秒钟再做某事

本文关键字:几秒 钟再做 OnMouseUp 事件 等待 | 更新日期: 2023-09-27 18:28:10

我正在编写一个带有一些动画的游戏,当用户单击按钮时使用这些动画。我想向用户显示动画,而不是"只是"用Application.loadLevel调用一个新级别。我想我可以在onMouseUp方法中使用Time.DeltaTime,并将其添加到预定义的0f值,然后检查它是否大于(例如)1f,但它不起作用,因为onMouseUp方法只添加"它自己的时间"作为delta时间。

我的脚本现在是这样的:

public class ClickScriptAnim : MonoBehaviour {
public Sprite pressedBtn;
public Sprite btn; 
public GameObject target;
public string message;
public Transform mesh;
private bool inAnim = true;
private Animator animator;
private float inGameTime = 0f;
// Use this for initialization
void Start () {
    animator = mesh.GetComponent<Animator>();
}

// Update is called once per frame
void Update () {
}
void OnMouseDown() {
    animator.SetBool("callAnim", true);
}
void OnMouseUp() {
    animator.SetBool("callAnim", false);
    animator.SetBool("callGoAway", true);
    float animTime = Time.deltaTime;
    Debug.Log(inGameTime.ToString());
// I would like to put here something to wait some seconds
        target.SendMessage(message, SendMessageOptions.RequireReceiver);
        }
    }
}

如何在OnMouseUp事件中等待几秒钟再做某事

我不完全确定你想在onMouseUp中使用Time.deltaTime做什么。这只是自上一帧渲染以来的时间(以秒为单位),无论你试图在哪里访问它,它都应该保持不变。通常,它用于每帧调用的函数,而不是像onMouseUp这样的一次性事件。

尽管不确定你想要实现什么,但听起来你应该使用Invoke:

http://docs.unity3d.com/ScriptReference/MonoBehaviour.Invoke.html

只需将希望延迟的代码放入一个单独的函数中,然后在onMouseUp中用延迟调用该函数。

编辑:为了备份其他人在这里说的话,我不会在这个例子中使用Thread.Sleep()。

您想要通过使用Coroutine来阻止Update循环来实现这一点(以及所有未显示为使游戏"冻结"的等待函数)。

这是你可能正在寻找的一个样本。

void OnMouseUp() 
{
    animator.SetBool("callAnim", false);
    animator.SetBool("callGoAway", true);
    //Removed the assignement of Time.deltaTime as it did nothing for you...
    StartCoroutine(DelayedCoroutine());
}
IEnumerator DoSomethingAfterDelay()
{
    yield return new WaitForSeconds(1f); // The parameter is the number of seconds to wait
    target.SendMessage(message, SendMessageOptions.RequireReceiver);
}

根据你的例子,很难准确地确定你想要完成什么,但上面的例子是在Unity 3D中延迟后做某事的"正确"方法。如果您想延迟动画,只需像我调用SendMessage一样,将调用代码放在Coroutine中即可。

协同程序是在它自己的特殊游戏循环上启动的,该循环在一定程度上与游戏的Update循环并行。这些对于许多不同的事情都非常有用,并提供了一种"线程"(尽管不是真正的线程)。

注意
不要在Unity中使用Thread.Sleep(),它会冻结游戏循环,如果在不好的时候使用,可能会导致崩溃。Unity游戏在一个处理所有生命周期事件(Awake()Start()Update()等)的线程上运行。调用Thread.Sleep()将停止这些事件的执行,直到它返回,这很可能不是你想要的,因为游戏似乎已经冻结,并导致糟糕的用户体验。