【问题标题】:Unity timer issue统一计时器问题
【发布时间】:2013-10-24 15:19:05
【问题描述】:

我将首先解释我想要做什么。

我有一个附有材料的对象。从我的相机中,我投射出一条光线,当它与我的物体碰撞时,我希望将该物体的材质放置到另一个第二物体上。这就是我的工作。

现在我试图通过让用户在物体离开物体 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 超过 4 秒,我的最后一个方法应该将我的 change material bool 设置为 true。

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");
    }

}

【问题讨论】:

    标签: c# timer unity3d


    【解决方案1】:

    尝试使用此计时器功能:

    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 并重置计时器。

    【讨论】:

    • 感谢您的回复,但是当我使用调试代码运行此程序时,它会以 4 的增量退出,因此当我需要 4、8、12 等时,它只能在 0 之间和 4.
    • 听起来你在IsTimerDone()返回true后继续调用它。检查您的 lastHitObject 相关代码,看看如何调整它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多