2013-10-24 80 views
2

我會解釋我想要做的首先。統一計時器問題

我有一個附着了材料的物體。在我的相機中,我有一條射線被投射出來,當它與我的物體發生碰撞時,我希望將該物體的材質放置在另一個第二個物體上。這是我的工作。

現在我試圖通過讓用戶在材料取下物體1並放置在物體2上之前長時間保持物體上的光線來擴大這一範圍。而且我遇到了一些問題。

當我的計時器接近分配的時間時,我的光線似乎停止擊中它,並且高光(在光線接觸它時出現的對象)消失。然後,當我向後看物體時,材料立即出現在我的另一個物體上,而不是重置時間。所以我想我可能不會正確地重置我的計時器。

Infact我是積極的,這是我的計時器,因爲即使我的射線沒有擊中任何東西,它似乎會觸發我的變更材料事件。

有人可以看看我的代碼並告訴我嗎?

方法,檢查什麼對象一直打到了光線和投射其材料到正確的對象投射的亮點我的射線擊中了目標

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

我應該設置的最後一個方法我的更改材料bool一旦start_time超過4秒,就返回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"); 
    } 

} 

回答

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您的數據。如果該值爲空,則不計時。如果它有一個值,則定時器處於活動狀態。要啓動它或檢查它,您使用IsTimerDone():它在啓動後第一次被調用4秒或更長時間時,將返回true並重置計時器。

+0

感謝您的迴應,但是當我使用調試代碼運行此代碼時,它回來時的時間以4,8,12等4爲增量進行註銷,當我需要的時候是僅在0和4之間。 – N0xus

+0

It聽起來像是在它返回true後繼續調用IsTimerDone()。檢查你的'lastHitObject'相關的代碼,看看你如何調整它。 –