2017-04-16 80 views
-1
using System.Collections; 
using System.Collections.Generic; 
using UnityEngine; 

public class Enemy_Jump : MonoBehaviour { 

    Rigidbody2D rb; 

    [SerializeField] 
    private float jumpHeight; 
    [SerializeField] 
    private float jumpDelay; 

    // Use this for initialization 
    void Start() { 
     rb = GetComponent<Rigidbody2D>(); 

    } 

    // Update is called once per frame 
    void Update() { 
     Jump(); 
    } 

    void Jump(){ 
     StartCoroutine ("Wait"); 
     rb.AddForce (new Vector2 (0, jumpHeight)); 

    } 

    IEnumerator Wait(){ 
     yield return new WaitForSeconds (jumpDelay); 
     Debug.Log ("waiting"); 
     yield return 0; 
    } 
} 

量我似乎有它不等待任何时间的问题。我还在waitForSeconds函数中输入了一个数字,但它仍然不会延迟任何事情。我不知道任何其他方式,也没有找到任何其他方式通过在线搜索延迟功能。为什么惯于我的程序等待时间

+1

的courotine不会影响您rb.AddForce线。一个courotine cand只延迟它里面的代码,而jump()不是从courotine调用的,而是从每一帧调用的更新 –

回答

1

尝试移动您在协同程序中添加力的位置。当你在Update函数中调用协程时,它基本上会调用每个框架的新协程,所以你需要某种方式知道你已经在等待。

bool isWaiting; 
IEnumerator Wait(){ 
    isWaiting = true; 

    Debug.Log ("waiting"); 
    yield return new WaitForSeconds (jumpDelay); 

    rb.AddForce (new Vector2 (0, jumpHeight)); 

    isWaiting = false; 
} 

所以,你会检查是否isWaiting是调用一个新的协程

// Update is called once per frame 
void Update() { 
    if (!isWaiting) 
     Jump(); 
} 

你或许应该使用InvokeRepeating,如果你想要做的事每隔一定时间之前错误的。从Update函数调用协程并不是一个好主意。

// Use this for initialization 
void Start() { 
    rb = GetComponent<Rigidbody2D>(); 

    InvokeRepeating("Wait", 0, jumpDelay); 
} 

void Wait(){ 

    rb.AddForce (new Vector2 (0, jumpHeight)); 
} 

InvokeRepeating Documentation

+0

。不幸的是,我已经尝试过了,它仍然不会等待任何时间。 – Camman012

+0

@ Camman012您还必须删除'Jump'函数中的'rb.AddForce(new Vector2(0,jumpHeight));'。 – CNuts

+0

@ Camman012检查我的编辑尝试使用'InvokeRepeating'。 – CNuts

相关问题