Я объясню, что я пытаюсь сделать в первую очередь.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");
}
}
Благодарим за отзыв, но когда я запустил это с кодом отладки, он вернулся с выдержкой времени с шагом 4, так что 4, 8, 12 и т. Д., Когда мне нужно, чтобы он переходил только между 0 и 4. – N0xus
Это похоже, что вы продолжаете называть 'IsTimerDone()' после того, как он возвращает 'true'. Проверьте свой код 'lastHitObject' и посмотрите, как его можно настроить. –