尝试使用协程使方法暂停,我做错了啥?

Posted

技术标签:

【中文标题】尝试使用协程使方法暂停,我做错了啥?【英文标题】:Trying to make a method pause using coroutines, what am i doing wrong?尝试使用协程使方法暂停,我做错了什么? 【发布时间】:2017-12-06 03:52:09 【问题描述】:
 using System.Collections;
 using System.Collections.Generic;
 using UnityEngine;

 [RequireComponent(typeof(Rigidbody2D))]

 public class Movement : MonoBehaviour
 
     //storage for the object's rigidbody
     public Rigidbody2D rb2D;
     //the public modifier for speed so i can edit from outside
     public float speed;
     //reliably take movements each second in an even, reliable manner. 
     void FixedUpdate()
     
         //i move left and right if  i use "a" or "d or "left" or "right" 
         float moveX = Input.GetAxis("Horizontal");
         //I move up and down if i use "w" or "s" or "up" or "down"
         float moveY = Input.GetAxis("Vertical");
         //Vector inputs the move directions into a vector2 so i can move
         Vector2 move = new Vector2(moveX, moveY);
         rb2D.velocity = move * speed;
     
     //following two methods are for the respective spikey builds
     public void slow()
     
         print("Shit, spike's got me!");
         speed = .3f;
         StartCoroutine(PauseTheSlowdown(2.1f));
         speed = 1;
     
     public void Bigslow()
     
         print("HOLY CRAP THAT HURT");
         speed = 0f;
         StartCoroutine(PauseTheSlowdown(3.7f));
         speed = 1;
     

     IEnumerator PauseTheSlowdown(float seconds)
     
         print("Pause this crap");
         yield return new WaitForSecondsRealtime(seconds);
     

 

我在这里遇到了一个问题,我的代码似乎非常好。它运行,然后当外部脚本从任何一种尖峰方法中提取时,它的行为就像协程甚至不存在一样,并且从减速回到全速。 除了协程根本不会导致等待发生之外,没有任何错误或问题。我在这里遗漏了什么明显的东西吗?

【问题讨论】:

【参考方案1】:

您不能将必须暂停的代码放在正常功能中。你必须把它放在协程函数中。

例如,在您的 Bigslow 函数中,Speed 变量将设置为 0PauseTheSlowdown 协程将被启动。 Unity 将仅在 PauseTheSlowdown 函数中等待一帧,然后返回到速度设置为 1Bigslow。它不会等待,因为您是从 void 函数启动它的。

你有两个选择:

1。将slowBigslow 函数设为IEnumerator 而不是void,然后在调用StartCoroutine 时屈服。

public IEnumerator slow()

    print("Shit, spike's got me!");
    speed = .3f;
    yield return StartCoroutine(PauseTheSlowdown(2.1f));
    speed = 1;


public IEnumerator Bigslow()

    print("HOLY CRAP THAT HURT");
    speed = 0f;
    yield return StartCoroutine(PauseTheSlowdown(3.7f));
    speed = 1;


IEnumerator PauseTheSlowdown(float seconds)

    print("Pause this crap");
    yield return new WaitForSecondsRealtime(seconds);

在调用StartCoroutine之前注意yield return

2.将要执行的代码移动到PauseTheSlowdown协程函数中等待一段时间:

public void slow()

    print("Shit, spike's got me!");
    StartCoroutine(PauseTheSlowdown(2.1f, .3f, 1));

public void Bigslow()

    print("HOLY CRAP THAT HURT");
    StartCoroutine(PauseTheSlowdown(3.7f, 0f, 1));


IEnumerator PauseTheSlowdown(float seconds, float before, float after)

    print("Pause this crap");
    speed = before;
    yield return new WaitForSecondsRealtime(seconds);
    speed = after;

【讨论】:

这回答了很多问题,谢谢。我马上试一试。

以上是关于尝试使用协程使方法暂停,我做错了啥?的主要内容,如果未能解决你的问题,请参考以下文章

Httpservlet错误404,不确定我做错了啥我已经尝试了所有解决方案

使用回溯创建给定列表的排列列表:我做错了啥?

django - Ajax 实时搜索,我做错了啥?

find() STL 算法...我做错了啥?

这个 GraphQL 查询我做错了啥?

核心数据多线程——我做错了啥