赞
踩
1, 新建工程做相关设置。
2 run.cs
- using System.Collections;
- using System.Collections.Generic;
- using UnityEngine;
-
- public class run : MonoBehaviour {
-
- [Header("Time Variables")]
- [Tooltip("设置间隔时间的两个变量")]
- public float proTime = 0.0f;
- public float NextTime = 0.0f;
-
- [Header("Speed")]
- [Tooltip("控制物体移动的快慢")]
- [Range(1, 100)]
- public float scaleSpeed = 5.0f;
-
-
- // Use this for initialization
- void Start () {
-
- }
-
- // Update is called once per frame
- void Update () {
-
- proTime = Time.fixedTime;
- if (proTime - NextTime == 3)
- //if (proTime - NextTime > 3)
- {
- print ("FixedTime Here" + (proTime - NextTime));
- transform.Translate (Vector3.up*scaleSpeed);
- //transform.Translate (Vector3.up*scaleSpeed*Time.deltaTime);
- NextTime = proTime;
- }
- }
- }
2 第二种思路是使用 InvokeRepeating()函数
InvokeRepeating("clearAnn", 1, 3); 放在Start里面,延迟1秒运行,之后没有间隔3秒钟调用一次 clearAnn函数
这样程序运行后,函数 clearAnn函数就可以和Update()函数配合实现多线程。
如果要延迟一段时间可以 clearAnn函数中设置
System.Threading.Thread.Sleep (3);
3 第三种思路是使用多线来实现
- private Thread clearThread;
-
- Void Start()
- {
-
- clearThread = new Thread (clearAnnotations);
-
-
- }
-
- void Update ()
- {
-
- //do something
- }
-
- void clearAnnotations()
- {
- //do another something
- }
-
如果在clearAnnotations中实现延时则如下,当然也可在里面根据需要控制bool变量的值,从而和update()里面的功能相配合,实现多线程。
- void clearAnnotations()
- {
- Thread.Sleep (3);
- this.GetComponent<LineRenderer> ().positionCount = 0;
- isNUll = true;
- i = 0;
- }
4 我想到的每四种方案是使用协程
但发现不行,也许是我程序写的不对。我要实现的功能是在Update里面绘制线条,在绘制完后大概3秒钟左右把绘制的清除,以便有利于我继续绘制,并继续3秒钟左右清除,一直循环。
但协程的效果是根本就绘不出线条,全部清除了。
我仔细一想,这应该和协同的原理有关,它就是一个主线程,然后把cpu分成小的单元,一会给yield之前的部分,一会给yield之后的部分。但也好像是不对呀。
不知道 为什么?
- using System.Collections;
- using System.Collections.Generic;
- using UnityEngine;
- using System.Threading;
-
- public class Annotations : MonoBehaviour {
-
- //to find HTC vive controller(Right or Left)
- //public SteamVR_TrackedObject trackedObj;
- private Thread clearThread;
-
- public float proTime = 0.0f;
- public float nextTime = 0.0f;
-
- private LineRenderer line;
-
-
- private int i = 0;
-
- Vector3 RunStart = Vector3.zero;
- Vector3 RunNext = Vector3.zero;
-
- bool isNUll = true;
-
-
- // Use this for initialization
- void Start ()
- {
-
- clearThread = new Thread (clearAnnotations);
- line = this.GetComponent<LineRenderer>();//获得该物体上的LineRender组件
- //line.SetColors(Color.blue, Color.red);//设置颜色
- //line.SetWidth(0.2f, 0.1f);//设置宽度
- //InvokeRepeating("clearAnn", 1, 3);
-
- }
- // Update is called once per frame
- void Update ()
- {
-
-
- var point = this.transform.position;
- //print ("point"+point);
-
- //To have lines using LineRenderer
- if(isNUll)
- {
- RunStart = point;
- isNUll = false;
- }
-
- RunNext = point;
- //print ("RunNext"+RunNext);
-
- if (RunStart != RunNext) {
- i++;
- line.SetVertexCount(i);//设置顶点数
- line.SetPosition(i-1, point);
-
- }
-
- RunStart = RunNext;
-
-
- // clear annotations
- // proTime = Time.fixedTime;
- // if (proTime - nextTime == 5) {
- //
- // this.GetComponent<LineRenderer> ().positionCount = 0;
- // isNUll = true;
- // i = 0;
- // nextTime = proTime;
- // }
-
- // StartCoroutine (clearA());
-
- if (Input.GetKeyDown(KeyCode.A) || Input.GetKeyDown(KeyCode.Q)) {
-
- this.GetComponent<LineRenderer> ().positionCount = 0;
- isNUll = true;
- i = 0;
- }
-
-
- }
-
- void clearAnnotations()
- {
- Thread.Sleep (3);
- this.GetComponent<LineRenderer> ().positionCount = 0;
- isNUll = true;
- i = 0;
- }
-
-
-
- IEnumerator clearA()
- {
- print ("222222");
- Thread.Sleep (3);
- yield return null;
- this.GetComponent<LineRenderer> ().positionCount = 0;
- isNUll = true;
- i = 0;
- }
-
-
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。