C# 使用协同程序或更新来减慢动画的速度

C# 使用协同程序或更新来减慢动画的速度,c#,unity3d,C#,Unity3d,我想做什么 当汽车与另一辆汽车碰撞时,逐渐停止汽车动画 当汽车退出碰撞器时,逐渐加速汽车动画 我有两种方法来实现这件事(意思是运行我的逻辑) 更新 共同例行程序 对于协同程序,我使用了这个 IEnumerator IncreaseSpeedGradually1(AnimationControlSpeed lastGOHitScript) { //stop if decrease speed in progress StopCoroutine("DecreaseSpeedGradu

我想做什么

  • 当汽车与另一辆汽车碰撞时,逐渐停止汽车动画
  • 当汽车退出碰撞器时,逐渐加速汽车动画
  • 我有两种方法来实现这件事(意思是运行我的逻辑)

  • 更新
  • 共同例行程序
  • 对于协同程序,我使用了这个

    IEnumerator IncreaseSpeedGradually1(AnimationControlSpeed lastGOHitScript)
    {
        //stop if decrease speed in progress
        StopCoroutine("DecreaseSpeedGradually");
        float decrementValue = ((lastHitVehicleSpeed / 2) * 2);
        while (lastGOHitScript.Speed <= lastHitVehicleSpeed)
        {
            lastGOHitScript.Speed += decrementValue * Time.deltaTime;
            yield return 0;
        }
        //setting speed to the last speed
        lastGOHitScript.Speed = lastGOHitScript.iniSpeeed;
    }
    


    这两种方法我都知道,但我想问的是,哪一种是做这项工作的正确方法?降低动画速度从而达到我的目标?我想corroutine稍后可能会在我的游戏中出现问题,性能问题是什么?

    不太清楚你的目标到底是什么。您描述的内容很清楚,但是您发布的两个代码片段做了完全不同的事情。但是,基本上,对于这么小的东西,我会使用Update(),因为如果出现问题,那么调试就更容易了,而且从理论上讲,您的代码中没有任何东西希望“线程化”/“侧任务化”(协程基本上是为了:做点什么-很可能是侧任务-异步)。

    作为补充说明,Update()中的代码可以进行一些优化,因此看起来如下所示:

    if (carAnimState == carAnimationState.starting) {
        carAnimState = carAnimationState.running;
    } else if (carAnimState == carAnimationState.stoping) {
        carAnimState = carAnimationState.running;
    } //this way the 2nd "if" won't be unnecessarily evaluated when animstate was .starting

    我还要添加一个方法,并从Update()调用它。预编译器很可能会将其内联(不能在Unity中强制)并且您的代码更可读。

    与更新相比,协同程序看起来更高效,因为更新需要布尔值或状态,这将持续检查,并且它可以提高性能overhead@MohammadFaizanKhan处理能力就是处理能力。无论Update()是否有效,或者是否从这一方面进行协同工作,都无关紧要,尤其是当工作必须一次性完成时。协同程序的功能在于“异步”,也就是说,无论它们做什么操作,都可以在帧之间“分割”(“yield”命令)。顺便说一句,如果不使用该值,您不需要返回任何内容(可以只返回“yield;”),在这种情况下,您也不必添加“IEnumerator”。
    if (carAnimState == carAnimationState.starting) {
        carAnimState = carAnimationState.running;
    } else if (carAnimState == carAnimationState.stoping) {
        carAnimState = carAnimationState.running;
    } //this way the 2nd "if" won't be unnecessarily evaluated when animstate was .starting