2017-07-02 4 views
0
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は1つのフレームをPauseTheSlowdownファンクションで待ってから、1に設定されたBigslowに戻ります。 void機能から起動しているので、それは待たないでしょう。

次の2つのオプションがあります:StartCoroutineが呼び出されたときに生じる、代わりにIEnumeratorvoidであるためにあなたのslowBigslow機能.Make

を。

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。あなたが実行しPauseTheSlowdownコルーチン機能にいくつかの時間を待つしたいコード.Move

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; 
} 
+0

これは、多くの質問に答え、ありがとうございました。私はすぐにそれを試してみましょう。 –

関連する問題