2013-10-24 5 views
2

Я объясню, что я пытаюсь сделать в первую очередь.Unity timer issue

У меня есть объект с прикрепленным к нему материалом. Из моей камеры у меня проецируется луч, и когда он сталкивается с моим объектом, я хочу, чтобы материал этого объекта был помещен на другой, второй объект. Это то, что я работаю.

Теперь я пытаюсь расширить это, если пользователь удерживает луч над объектом в течение длительного периода времени, прежде чем материал снимает объект 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 true, когда start_time составляет более 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"); 
    } 

} 

ответ

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 и сбросит таймер.

+0

Благодарим за отзыв, но когда я запустил это с кодом отладки, он вернулся с выдержкой времени с шагом 4, так что 4, 8, 12 и т. Д., Когда мне нужно, чтобы он переходил только между 0 и 4. – N0xus

+0

Это похоже, что вы продолжаете называть 'IsTimerDone()' после того, как он возвращает 'true'. Проверьте свой код 'lastHitObject' и посмотрите, как его можно настроить. –