C# 如何在OnMouseUp事件中执行操作之前等待几秒钟

C# 如何在OnMouseUp事件中执行操作之前等待几秒钟,c#,unity3d,C#,Unity3d,我正在编写一个带有一些动画的游戏,当用户单击按钮时使用这些动画。我想向用户展示动画,而不是用Application.loadLevel“仅仅”调用一个新级别。我想我可以在onMouseUp方法中使用Time.DeltaTime并将其添加到预定义的0f值,然后检查它是否大于(例如)1f,但它无法工作,因为onMouseUp方法只将“它自己的时间”添加为delta时间 我的脚本现在看起来像这样: public class ClickScriptAnim : MonoBehaviour { publ

我正在编写一个带有一些动画的游戏,当用户单击按钮时使用这些动画。我想向用户展示动画,而不是用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);
        }
    }
}
公共类ClickScriptAnim:MonoBehavior{
公共精灵按BTN;
公共精灵btn;
公共游戏对象目标;
公共字符串消息;
公共变换网格;
private bool inAnim=真;
私人动画师;
专用浮点inGameTime=0f;
//用于初始化
无效开始(){
animator=mesh.GetComponent();
}
//每帧调用一次更新
无效更新(){
}
void OnMouseDown(){
SetBool(“callAnim”,true);
}
void OnMouseUp(){
SetBool(“callAnim”,false);
SetBool(“callGoAway”,true);
float animTime=Time.deltaTime;
Log(inGameTime.ToString());
//我想在这里放点东西等几秒钟
target.SendMessage(message,SendMessageOptions.RequireReceiver);
}
}
}

我不完全确定您在onMouseUp中使用Time.deltaTime试图做什么。这只是自渲染最后一帧以来的时间(以秒为单位),无论您尝试在何处访问它,其行为都应相同。通常,它用于每帧调用的函数中,而不是像onMouseUp这样的一次性事件

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

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

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

您希望通过使用
协同程序阻止
更新
循环来执行此操作(以及所有看起来不会使游戏“冻结”的等待函数)

这是您可能正在寻找的示例

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
调用一样,将调用代码放在协同程序中

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

注意

不要在Unity中使用
Thread.Sleep()
,它会冻结游戏循环,如果在不合适的时间执行,可能会导致崩溃。Unity游戏在处理所有生命周期事件的单个线程上运行(
Awake()
Start()
Update()
,等等)。调用
Thread.Sleep()
将停止这些事件的执行,直到它返回,这很可能不是您正在寻找的,因为它将显示游戏已冻结并导致不良的用户体验

Thread.Sleep(1000)将等待一秒钟,您是否正在沿着这条线寻找一些东西?您试图等待一段时间的代码在哪里?正如我所写的,我试图将inGameTime+=time.deltaTime放入onMouseUp()方法,但是它并没有按预期的那样工作,因为OnMouseUp方法只返回一个最小的deltatime,您不想在处理用户输入时等待它。如果希望动画延迟,那么为什么不使用在启动时不执行任何操作(对于某些帧数)的动画呢?