目录
执行1次/重复执行
this.Invoke("dosomething", 3);//开始3秒后执行,仅执行1次
this.InvokeRepeating("dosomething", 5, 2);//延迟5秒后每隔2秒执行1次
public class delay : MonoBehaviour
{
float speed=0.2f;
// Start is called before the first frame update
void Start()
{
//this.Invoke("dosomething", 3);//开始3秒后执行
this.InvokeRepeating("dosomething", 5, 2);//延迟5秒后每隔2秒执行1次
}
// Update is called once per frame
void Update()
{
this.gameObject.transform.Translate(0, speed, 0, Space.Self);
}
void dosomething()
{
speed *= -1;
Debug.Log(Time.time+":"+ speed);
}
}
unity执行是单线程的。
顾名思义,轻音少女女主单线程。
若线程已被调度,判断函数是否在队列中
增加程序稳健性
IsInvoking()
if (Input.GetMouseButtonDown(0))
{
if (IsInvoking())
{
Debug.Log("已被调用,稍后点击");
}
else
{
this.Invoke("dosomething", 2);//开始2秒后执行
}
}
取消函数在队列中的调用
不带参数,取消全部函数在队列的调用。
带,只取消该函数的。
CancelInvoke("dosometing");
CancelInvoke();
if (Input.GetMouseButtonDown(0))
{
if (IsInvoking())
{
CancelInvoke("dosometing");
Debug.Log("取消调用");
}
else
{
Debug.Log("成功调用");
this.Invoke("dosomething", 2);//开始3秒后执行
}
}
实例:红绿灯
public class traffic : MonoBehaviour
{
public Material[] m;
public MeshRenderer meshRenderer;
int index = 0;
public GameObject red;
public GameObject green;
public GameObject yellow;
int ans = -1;
// Start is called before the first frame update
void Start()
{
change();
}
// Update is called once per frame
void Update()
{
}
void change()
{
if (index == 0)
{
color();
Invoke("change", 4);
}else if (index == 1)
{
color();
Invoke("change", 1);
}else if (index == 2)
{
color();
Invoke("change", 4);
}
if (index == 2 || index == 0)
ans *= -1;
index +=ans;
}
void color()
{
if(index==0)
{
meshRenderer = red.GetComponent<MeshRenderer>();
meshRenderer.material = m[index];
meshRenderer = yellow.GetComponent<MeshRenderer>();
meshRenderer.material = m[3];
meshRenderer = green.GetComponent<MeshRenderer>();
meshRenderer.material = m[3];
}
if (index == 1)
{
meshRenderer = red.GetComponent<MeshRenderer>();
meshRenderer.material = m[3];
meshRenderer = yellow.GetComponent<MeshRenderer>();
meshRenderer.material = m[index];
meshRenderer = green.GetComponent<MeshRenderer>();
meshRenderer.material = m[3];
}
if (index == 2)
{
meshRenderer = red.GetComponent<MeshRenderer>();
meshRenderer.material = m[3];
meshRenderer = yellow.GetComponent<MeshRenderer>();
meshRenderer.material = m[3];
meshRenderer = green.GetComponent<MeshRenderer>();
meshRenderer.material = m[index];
}
}
}