统一计时器问题
本文关键字:问题 计时器 | 更新日期: 2023-09-27 18:36:54
我将首先解释我想要做什么。
我有一个附有材料的物体。从我的相机上,我投射了一条光线,当它与我的物体碰撞时,我希望将该物体的材料放置在另一个物体上。这就是我的工作。
现在,我试图通过让用户在材料从对象 1 上取下并放置在对象 2 上之前将光线长时间保持在对象上来扩展这一点。我遇到了一些问题。
当我的计时器接近分配的时间时,我的光线似乎停止击中它,高光(当光线接触它物体时出现)消失。然后,当我移开视线并返回对象时,材质不会重置时间,而是立即出现在我的另一个对象上。所以我想我可能无法正确重置计时器。
事实上,我很肯定这与我的计时器有关,因为即使我的光线没有击中任何东西,它似乎也会触发我的更换材料事件。
有人可以看看我的代码并告诉我吗?
检查被射线击中的物体并将其材料投射到正确物体上的方法
void CastRay()
{
if(hit.collider.gameObject.tag == "Colour1" && change_material == true)
{
new_colour1.ChangeObjectMaterialColour(hit.collider.gameObject.renderer.material.color);
var colums = GameObject.FindGameObjectsWithTag("column");
foreach( GameObject c in colums)
c.GetComponent<MeshRenderer>().materials[1].color = new_colour1.orignalMaterial;
}
}
void ResetTimer()
{
start_time = Time.time;
running_time = 0f;
track_timer = false;
}
投射高亮显示我的光线击中的对象的代码:
void HighLight(GameObject nextHitObject)
{
// Case1: Last ray and new ray both hit objects
if(lastHitObject != null && nextHitObject != null)
{
//1a: same objects, do nothing
if(lastHitObject.tag == nextHitObject.tag)return;
{ //1b: different objects, swap highlight texture
lastHitObject.renderer.material = oldMat;
lastHitObject = nextHitObject;
oldMat = lastHitObject.renderer.material;
lastHitObject.renderer.material = highlight_material;
track_timer = true;
return;
}
}
// Case2: Last ray hit nothing, new ray hit object.
if(lastHitObject == null && nextHitObject != null)
{
ResetTimer();
lastHitObject = nextHitObject;
oldMat = lastHitObject.renderer.material;
lastHitObject.renderer.material = highlight_material;
track_timer = true;
if(spawned_amount == 0)
{
StatusBar();
}
return;
}
// Case3: Last ray hit something, new ray hit nothing
if(lastHitObject != null && nextHitObject == null)
{
lastHitObject.renderer.material = oldMat;
lastHitObject = null;
track_timer = false;
return;
}
else
{
spawned_amount = 0;
Destroy (GameObject.FindWithTag("StatusBar"));
change_material = false;
}
}
计时器代码
void Check(bool updateTimer)
{
if(updateTimer)
{
start_time = Time.time - end_time;
running_time += Time.deltaTime;
if ( running_time >= end_time )
{
track_timer = false;
}
}
else
end_time = Time.time;
}
我最后一种方法应该在start_time后将我的更改材料布尔值设置为 true,超过 4 秒。
void StatusBar()
{
if(start_time >= 4)
{
spawned_amount = 0;
Debug.Log("status bar function");
change_material = true;
Debug.Log("chaging amterial");
}
else
{
change_material = false;
ResetTimer();
Debug.Log("resetting timer");
}
}
请尝试使用此计时器功能:
float? start_time;
void ResetTimer()
{
start_time = null;
}
bool IsTimerDone()
{
if (start_time == null)
start_time = Time.time;
else if ((Time.time - start_time) >= 4)
{
ResetTimer();
return true;
}
return false;
}
它将您的数据存储在一个float? start_time
中。如果值为 null,则不会计时任何内容。如果它有值,则计时器处于活动状态。要启动或检查它,您可以使用 IsTimerDone()
:启动后 4 秒或更长时间第一次调用它时,它将返回true
并重置计时器。