例如有三个按钮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;
}
}
}
思路都是差不多的,改改就行了
<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>;
用不着协程
public class NewBehaviourScript : MonoBehaviour
{
int temp =0;
// Start is called before the first frame update
public void ButtonClick(int x)
{
if(x-1==temp)
{
Debug.Log("点击了第" + x + "按钮");
temp++;
}else
{
Debug.Log("顺序点错了");
}
if (temp == 3)
{
Debug.Log("完成");
temp=0;
}
}
}
三个按钮A B C依次添加带参数的监听参数分别是1 2 3.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class NewBehaviourScript : MonoBehaviour
{
Stack<string> mStack = new Stack<string>();
string Temp = "";
private void Start()
{
mStack.Push("C");
mStack.Push("B");
mStack.Push("A");
StartCoroutine("ListenButtonClick");
}
IEnumerator ListenButtonClick()
{
while (mStack.Count > 0)
{
yield return new WaitForEndOfFrame();
if (!Temp.Equals(""))
{
if (mStack.Peek().Equals(Temp))
{
Debug.Log("按钮" + Temp + "按下");
mStack.Pop();
}
else
{
Debug.Log("按错了");
}
Temp="";
}else
{
continue;
}
}
Debug.Log("按完了");
}
public void ButtonClick(string s)
{
Temp = s;
}
}
协程版