我會解釋我想要做的首先。統一計時器問題
我有一個附着了材料的物體。在我的相機中,我有一條射線被投射出來,當它與我的物體發生碰撞時,我希望將該物體的材質放置在另一個第二個物體上。這是我的工作。
現在我試圖通過讓用戶在材料取下物體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");
}
}
感謝您的迴應,但是當我使用調試代碼運行此代碼時,它回來時的時間以4,8,12等4爲增量進行註銷,當我需要的時候是僅在0和4之間。 – N0xus
It聽起來像是在它返回true後繼續調用IsTimerDone()。檢查你的'lastHitObject'相關的代碼,看看你如何調整它。 –