尝试使用协程使方法暂停,我做错了啥?
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
变量将设置为 0
。 PauseTheSlowdown
协程将被启动。 Unity 将仅在 PauseTheSlowdown
函数中等待一帧,然后返回到速度设置为 1
的 Bigslow
。它不会等待,因为您是从 void
函数启动它的。
你有两个选择:
1。将slow
和Bigslow
函数设为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;
【讨论】:
这回答了很多问题,谢谢。我马上试一试。以上是关于尝试使用协程使方法暂停,我做错了啥?的主要内容,如果未能解决你的问题,请参考以下文章