用户空输入检查一段时间和线程

时间:2016-07-30 04:46:39

标签: c# multithreading unity3d timer

public class green : MonoBehaviour
{
    private AudioSource source;
    public AudioClip sound;
    static int result = 0;

    void Start()
    {
        StartCoroutine("RoutineCheckInputAfter3Minutes");
        Debug.Log("a");
    }

    IEnumerator RoutineCheckInputAfter3Minutes()
    {
        System.Random ran = new System.Random();
        int timeToWait = ran.Next(1, 50) * 1000;
        Thread.Sleep(timeToWait);

        source = this.gameObject.AddComponent<AudioSource>();
        source.clip = sound;
        source.loop = true;
        source.Play();

        System.Random r = new System.Random();
        result = r.Next(1, 4);
        Debug.Log("d");

        yield return new WaitForSeconds(3f * 60f);
        gm.life -= 1;
        Debug.Log("z");
    }

    public void Update()
    {
        if (result == 1 && gm.checka == true)
        {
            Debug.Log("e");
            StopCoroutine("RoutineCheckInputAfter3Minutes");
            gm.life += 1;
            source.Stop();
            gm.checka = false;
            Debug.Log("j");
        }
        if (result == 2 && gm.checkb == true)
        {
            Debug.Log("f");

            StopCoroutine("RoutineCheckInputAfter3Minutes");
            gm.life += 1;
            source.Stop();
            gm.checkb = false;
            Debug.Log("z");
        }
        else if (result == 3 && gm.checkc == true)
        {
            StopCoroutine("RoutineCheckInputAfter3Minutes");
            Debug.Log("g");
            gm.life += 1;
            source.Stop();
            gm.checkc = false;
            Debug.Log(gm.life);
        }
    }
}

有两个问题

  1. 如果用户没有按任何按钮3分钟,我想让音乐停止并且生命变量减少-1。但是如果用户按下右键,生命变量将增加+ 1.但我不知道如何从用户那里获得3分钟的空输入。

  2. 如果我在此程序中使用while,则会关闭...直到生命低于0,我想重复播放不定时播放的音乐。

1 个答案:

答案 0 :(得分:1)

编辑:不要在Unity中使用Thread

How Unity works

Alternative to Thread

Couroutine Example 1

Coroutine Example 2

*说实话,Thread.Sleep挂起Unity,Unity无法正常运行,这就是为什么它看起来运行缓慢。

您可以使用协同程序解决此问题。

void Start()
{
    StartCoroutine("RoutineCheckInputAfter3Minutes");
}

IEnumerator RoutineCheckInputAfter3Minutes()
{
    yield return new WaitForSeconds(3f*60f);
    gm.life -= 1;
}

void RightButtonClicked()
{
    gm.life += 1;

    StopCoroutine("RoutineCheckInputAfter3Minutes");
    StartCoroutine("RoutineCheckInputAfter3Minutes");
}

或者,如果其他代码部分有效,您可以将a函数转换为协程

void Start()
{
    StartCoroutine(a());
}
public IEnumerator a()
{
    while (gm.life >= 0)
    {
        System.Random ran = new System.Random();
        int timeToWait = ran.Next(1, 50) * 1000;
        yield return new WaitForSeconds(timeToWait);

        source = this.gameObject.AddComponent<AudioSource>();
        source.clip = sound;
        source.loop = true;
        source.Play();

        System.Random r = new System.Random();
        result = r.Next(1, 4);
        Debug.Log("d");
    }
}
  

这是基于您的代码的协同程序的示例用法超出范围超出范围:

     

A pastebin link to code

相关问题