拉緹娜 2021-06-24 14:40 采纳率: 50%
浏览 299
已采纳

Unity如何利用协程完成按顺序操作?

例如有三个按钮ABC,功能分别是Debug打印"This is A"/“This is B"/"This is C"。现在需要用户按顺序点击ABC,顺序正确时实现相应按键功能,否则另外打印"Wrong",然后要求用户继续按顺序点击按钮。

例:用户先点击A,控制台打印”This is A“;然后点击C,打印”Wrong“;再点击A,打印”Wrong“;点击B,打印"This is B";最后点击C打印"This is C",完成。

public class StepCtrl : MonoBehaviour
    {
        public GameObject knife, workBench;
        public Transform workBenchPos_des;
        private int key, step;

        private bool isClick;
        private string button;
        
        private void OnEnable()
        {
            StartCoroutine(Step());
        }
        private void Start()
        {
            button = "";
            isClick = false;
        }
        public void onClick(string name)
        {
            isClick = true;
            button = name;
        }

        private void Update()
        {
            key = model.getStep();

            if (!model.ishandle && step > 2)
            {
                step = 2;
            }
            if (!model.isRotate && step > 4)
            {
                step = 4;
            }
            if (step == 6 && Vector3.Distance(knife.transform.position, workBenchPos_des.position) > 0.5f)
            {
                step = 5;
            }
            if (step == 8 && Vector3.Distance(knife.transform.position, workBenchPos_des.position) < 0.5f)
            {
                step = 7;
            }
        }
        bool OperationCheck(int s)//
        {
            if (Input.GetMouseButtonDown(0))
            {
                Debug.Log(s);
                if (key == s)//按下的按键等于当前步骤按键
                {
                    Debug.Log("按下正确按钮");
                    return true;
                }
                else if(key < s)
                {
                    if (key == 5 && s == 7)
                    {
                        return true;
                    }
                    return false;
                }
                else
                {
                    error.text = "<color=red>当前位置还用不到此按钮</color>";
                    return false;
                }
            }
            return false;
        }
        
        IEnumerator Step()
        {
            Debug.Log("开始协程");
            step = 1;
            while (step < 9)
            {
                yield return new WaitForSeconds(0.1f);
                yield return StartCoroutine("Step"+step);
                step++;
            }
            
            notice.text = "<color=green>恭喜完成练习!!!!</color>";
            Debug.Log("恭喜完成练习");
        }
        IEnumerator Step1()
        {
            Debug.Log("开始协程一");
            if (button == "归零" && isClick)
            {
                Debug.Log("请点击【归零】按钮");
                step--;
                isClick = false;
            }
            OperationCheck(1);
            yield return null;
        }
        IEnumerator Step2()
        {
            Debug.Log("开始协程二");
            if (button == "手动模式" && isClick)
            {
                Debug.Log("请点击【手动模式】按钮");
                step--;
                isClick = false;
            }
            OperationCheck(2);
            yield return null;
        }
        IEnumerator Step3()
        {
            Debug.Log("开始协程三");
            Debug.Log("请点击【高速/低速】按钮");
            if (button == "高速/低速" && isClick)
            {

                Debug.Log("key: "+key);
                Debug.Log("step: "+step);
                step--;
                isClick = false;
            }
            OperationCheck(3);
            yield return null;
        }
        IEnumerator Step4()
        {
            Debug.Log("开始协程四");
            if (button == "轴起/轴停" && isClick)
            {
                Debug.Log("请点击【轴启/轴停】按钮");
                step--;
                isClick = false;
            }
            OperationCheck(4);
            yield return null;
        }
        IEnumerator Step5()
        {
            Debug.Log("开始协程五");
            if (Vector3.Distance(knife.transform.position, workBenchPos_des.position) > 0.5f)
            {
                Debug.Log("请点击【x,y,z】按钮(第五步)");
                step--;
            }
            OperationCheck(5);
            yield return null;
        }
        IEnumerator Step6()
        {
            Debug.Log("开始协程六");
            if (x != 0 || y != 0 || z != 0)
            {
                Debug.Log("请点击【xy->0,z->0】按钮(第六步)");
                step--;
            }
            OperationCheck(6);
            yield return null;
        }
        IEnumerator Step7()
        {
            Debug.Log("开始协程七");
            if (Vector3.Distance(knife.transform.position, workBenchPos_des.position) <= 0.5f)
            {
                Debug.Log("请点击【x,y,z】按钮(第七步)");
                step--;
            }
            OperationCheck(7);
            yield return null;
        }
        IEnumerator Step8()
        {
            Debug.Log("开始协程八");
            if (key!=8)
            {
                step--;
            }
            Debug.Log("请点击【回零】按钮");
            OperationCheck(8);
            yield return null;
        }
    }
}
  • 写回答

3条回答 默认 最新

  • 带酒书生 2021-06-25 10:56
    关注

    思路都是差不多的,改改就行了

    <span class="hljs-keyword">using</span> System.Collections;
    <span class="hljs-keyword">using</span> UnityEngine;
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">class</span> <span class="hljs-title">NewBehaviourScript</span> : <span class="hljs-title">MonoBehaviour</span>
    {
        MyEvent mEvent;
        <span class="hljs-built_in">bool</span> IsButtonClick = <span class="hljs-literal">false</span>;
        <span class="hljs-built_in">int</span> mStepCount = <span class="hljs-number">3</span>;
        <span class="hljs-built_in">int</span> mCurrentStep = <span class="hljs-number">0</span>;
        <span class="hljs-built_in">int</span> mTemp = <span class="hljs-number">0</span>;
        <span class="hljs-function"><span class="hljs-keyword">private</span> <span class="hljs-keyword">void</span> <span class="hljs-title">Start</span>(<span class="hljs-params"></span>)</span>
        {
            StartCoroutine(<span class="hljs-string">"CheckStep"</span>);
        }
        <span class="hljs-function"><span class="hljs-keyword">private</span> <span class="hljs-keyword">void</span> <span class="hljs-title">Update</span>(<span class="hljs-params"></span>)</span>
        {
            <span class="hljs-keyword">if</span>(mEvent!=<span class="hljs-literal">null</span>)
            {
                mEvent.Invoke();
            }
        }
        <span class="hljs-function">IEnumerator <span class="hljs-title">CheckStep</span>(<span class="hljs-params"></span>)</span>
        {
            <span class="hljs-keyword">while</span> (mCurrentStep < mStepCount)
            {
                <span class="hljs-function"><span class="hljs-keyword">yield</span> <span class="hljs-keyword">return</span> <span class="hljs-keyword">new</span> <span class="hljs-title">WaitUntil</span>(<span class="hljs-params">(</span>)</span> => { <span class="hljs-keyword">return</span> IsButtonClick; });
                <span class="hljs-keyword">if</span> (mTemp == mCurrentStep + <span class="hljs-number">1</span>)
                {
                    mCurrentStep++;
                    DifferentStepContent();
                }
                <span class="hljs-keyword">else</span>
                {
                    Debug.Log(<span class="hljs-string">"顺序错了"</span>);
                }
                IsButtonClick = <span class="hljs-literal">false</span>;
    
            }
        }
        <span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">DifferentStepContent</span>(<span class="hljs-params"></span>)</span>
        {
            mEvent=<span class="hljs-literal">null</span>;
            <span class="hljs-keyword">switch</span> (mCurrentStep)
            {
                <span class="hljs-keyword">case</span> <span class="hljs-number">1</span>:
                    mEvent+=Step1Methord;
                <span class="hljs-keyword">break</span>;
                <span class="hljs-keyword">case</span> <span class="hljs-number">2</span>:
                    mEvent+=Step2Methord;
                <span class="hljs-keyword">break</span>;
                <span class="hljs-keyword">case</span> <span class="hljs-number">3</span>:
                    mEvent+=Step3Methord;
                <span class="hljs-keyword">break</span>;
                <span class="hljs-literal">default</span>:<span class="hljs-keyword">break</span>;
            }
        }
        <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">ButtonClick</span>(<span class="hljs-params"><span class="hljs-built_in">int</span> x</span>)</span>
        {
            mTemp = x;
            IsButtonClick = <span class="hljs-literal">true</span>;
        }
        <span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">Step1Methord</span>(<span class="hljs-params"></span>)</span>
        {
            Debug.Log(<span class="hljs-string">"进入到第"</span> + mCurrentStep + <span class="hljs-string">"步"</span>);
            <span class="hljs-comment">//放第1步逻辑</span>
        }
         <span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">Step2Methord</span>(<span class="hljs-params"></span>)</span>
        {
            Debug.Log(<span class="hljs-string">"进入到第"</span> + mCurrentStep + <span class="hljs-string">"步"</span>);
            <span class="hljs-comment">//放第2步逻辑</span>
        }
         <span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">Step3Methord</span>(<span class="hljs-params"></span>)</span>
        {
            Debug.Log(<span class="hljs-string">"进入到第"</span> + mCurrentStep + <span class="hljs-string">"步"</span>);
            <span class="hljs-comment">//放第3步逻辑</span>
        }
    }
    <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-built_in">delegate</span> <span class="hljs-keyword">void</span> <span class="hljs-title">MyEvent</span>(<span class="hljs-params"></span>)</span>;
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 C++ 头文件/宏冲突问题解决
  • ¥15 用comsol模拟大气湍流通过底部加热(温度不同)的腔体
  • ¥50 安卓adb backup备份子用户应用数据失败
  • ¥20 有人能用聚类分析帮我分析一下文本内容嘛
  • ¥15 请问Lammps做复合材料拉伸模拟,应力应变曲线问题
  • ¥30 python代码,帮调试
  • ¥15 #MATLAB仿真#车辆换道路径规划
  • ¥15 java 操作 elasticsearch 8.1 实现 索引的重建
  • ¥15 数据可视化Python
  • ¥15 要给毕业设计添加扫码登录的功能!!有偿