这是我上一个问题的后续,现在我正在寻找扩展它的功能,但我遇到了一些主要障碍。
我的目标如下:
我有一台相机,它正在投射光线以击中带有特定标签的物体。当光线在一段时间内击中标签时,我正在寻找发生的事情,现在我正在寻找的只是调试消息或简单的东西。当射线没有击中带有标签的任何对象时,我希望我的计时器不更新。如果用户将视线从对象上移开并返回,我希望计时器再次从 0 开始,并且如果用户查看另一个标签(即计时器再次启动),我想要类似的功能。
但是,我的计时器没有按预期工作,无论我在看什么,它都在不停地计数。我在这上面花了 3 个小时,而且我已经获得了隧道视野,在那里我不断尝试相同的代码行。
有一双双眼睛的人可以看看我到目前为止所做的事情并向我指出我错过了什么/做错了什么吗?
public float end_time;
public float start_time;
private float running_time;
public Texture2D progress_bar_empty;
public Texture2D progress_bar_full;
public Material highlight_material;
public float progress = 0;
public bool hited = false;
public List<string> _tags = new List<string>();
private GameObject hit_object;
private Material oldMat;
RaycastHit hit;
// Use this for initialization
void Start ()
{
start_time = Time.deltaTime;
running_time = 0;
}
// Update is called once per frame
void Update ()
{
EyeTarget();
Check(hited);
}
void EyeTarget()
{
try
{
Vector3 fwd = transform.TransformDirection(Vector3.forward);
if (Physics.Raycast(transform.position, fwd, out hit))
{
foreach(string t in _tags)
{
if(hit.collider.gameObject.tag == t)
{
HighLight();
}
}
}
Debug.DrawRay(transform.position, fwd, Color.red);
}
catch(Exception e)
{
Debug.Log(e.Message);
}
}
void ResetTimer()
{
start_time = Time.time;
running_time = 0f;
//Debug.Log("resetting timer");
}
void HighLight()
{
if(hit_object == null)
{
ResetTime();
oldMat = hit.transform.renderer.material;
hit.collider.gameObject.renderer.material = highlight_material;
hit_object = hit.collider.gameObject;
hited = true;
}
else if( hit.transform.tag != hit_object.tag)
{
//hit.collider.gameObject.renderer.material = oldMat;
hit_object = null;
hit_object.renderer.material = oldMat;
progress = 0;
Debug.Log("hi");
hited = false;
}
}
// see if ray has hit object
void Check(bool hit)
{
if(hit)
{
start_time = Time.time - end_time;
running_time += Time.deltaTime;
if ( running_time >= end_time )
{
hited = false;
}
}
else if( hited == false)
ResetTime();
}
void ResetTime()
{
start_time = Time.time;
running_time = 0f;
Debug.Log("restting timer");
}