如何在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中使用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()
将停止这些事件的执行,直到它返回,这很可能不是你想要的,因为游戏似乎已经冻结,并导致糟糕的用户体验。