我试图在投球后让球重置10秒延迟 球正常休息。但如何延迟球重置请帮助我。 球重置太快了。 我也使用过这个功能,但它不能正常工作请帮助我 我正处于游戏阶段的最后阶段。
using UnityEngine;
using System.Collections;
public class Ball : MonoBehaviour {
public Vector3 launchVeclocity;
//private const float RESET_TIME = 5.0f; // time to be taken for reset
public bool inPlay = false;
private Vector3 ballStartPos;
private Rigidbody rigidBody;
private AudioSource audioSource;
// Use this for initialization
void Start () {
rigidBody = GetComponent<Rigidbody>();
//rigidBody.useGravity = false;
ballStartPos = transform.position;
}
public void Launch (Vector3 velocity)
{
inPlay = true;
rigidBody.useGravity = true;
rigidBody.velocity = velocity;
audioSource = GetComponent<AudioSource> ();
audioSource.Play ();
}
void Update() {
Waiting ();
}
public void Reset() {
inPlay = false;
//yield return new WaitForSeconds (5);
transform.position = ballStartPos;
transform.rotation = Quaternion.identity;
rigidBody.velocity = Vector3.zero;
rigidBody.angularVelocity = Vector3.zero;
rigidBody.useGravity = false;
}
IEnumerator Waiting ()
{
Reset ();
yield return new WaitForSeconds (10);
}
}
答案 0 :(得分:0)
你不应该像现在一样通过在Update()中调用它来解决每个帧上的协同程序(但这不是你提出的问题)。它实际上没有等待的原因是你直接调用Waiting()而不是使用StartCoroutine(Waiting())。
答案 1 :(得分:0)
我将假设Launch
是抛出球的方法。
首先,从您的Waiting()
方法移除对Update
的来电,您不希望直接调用Waiting()
方法。
您需要在Launch方法中启动Coroutine:
public void Launch (Vector3 velocity)
{
inPlay = true;
rigidBody.useGravity = true;
rigidBody.velocity = velocity;
audioSource = GetComponent<AudioSource> ();
audioSource.Play ();
// start the Coroutine to introduce the reset delay
StartCoroutine(Waiting());
}
IEnumerator Waiting ()
{
// suspect executing in this routine for 10 seconds
yield return new WaitForSeconds (10);
// now call reset
Reset();
}
答案 2 :(得分:0)
使用Invoke(),方便了。 你已经有了这个方法所以它只需要这个作为你的Launch()方法:
public void Launch (Vector3 velocity)
{
inPlay = true;
rigidBody.useGravity = true;
rigidBody.velocity = velocity;
audioSource = GetComponent<AudioSource> ();
audioSource.Play ();
Invoke("Reset", 10);
}
您可以摆脱整个Waiting()
方法
答案 3 :(得分:0)
Systeam.Threading.Thread.Sleep
IEnumerator Waiting ()
{
Reset ();
yield return Thread.Sleep(10000); // In miliseconds.
}