2012-05-16 170 views
0

我想要一個3D旋轉3D遊戲對象。它實際上是一個只有撲克籌碼紋理的圓柱體。一旦與raycast相撞,我想旋轉它360度。它在Unity仿真器中工作得很好,但是,在設備本身,芯片在旋轉後停止,然後繼續無限循環旋轉。這是有問題的代碼片段。感謝您提前提供任何幫助。Unity 3D旋轉游戲對象

// Spin the chip 
if (Animate) { 
    if (Speed > 0 && Chip.tag.Contains("Chip")) { 
     Chip.transform.Rotate(0, Speed*Time.deltaTime, 0); 
     Speed -= 3; 
     Debug.Log(Speed); 
    } 
    else { 
     // Reset 
     Animate = false; 
     Speed = 360; 
     Chip.transform.localRotation = Quaternion.Euler(0.0,0.0,0.0); 
    } 
} 

要summorize這個我可以在遊戲對象芯片被分配最好的,當在光線投射碰撞這樣

// Set the chip 
    Chip = hit.transform; 

一切都在更新功能來完成。一旦光線投射命中,它就會調用投注功能,然後在計算投注後,它會將布爾Animate更改爲真,從而導致芯片旋轉。

+0

debug.log告訴你什麼? –

+0

Debug.Log(速度)只顯示正在倒計時的整數速度。 – amedeiros

+0

它是否命中0?繼續前進0? –

回答

0

東西被設定一些其他的代碼Animate = true,很難說什麼事情,沒有看到它的其餘部分。

把一些調試位置旁邊的動畫設置爲true的每一個現場,你會看到別的東西將它設置,唯一可能的解釋,爲什麼它繼續旋轉。

另一種選擇是使用動畫工具,而不是旋轉,您只需播放爲您執行旋轉的動畫。

編輯:機會是觸摸代碼的周圍,因爲當您在編輯器中使用按鍵敲擊進行調試時。我經歷過幾次的陷阱。

0

James Gramosli是正確的,一些其他代碼再次觸發動畫,它很可能是您的觸摸代碼。在編輯器和支持觸摸的設備之間移動時,這是一個常見問題。通過使用UnityRemote來驗證代碼的控制流程,您可以確定是否屬於這種情況。這就是說,我會將您的代碼更改爲以下代碼,該代碼從運行每個框架的Update循環中移除旋轉代碼。這是一個小小的優化,但主要是它清理了架構,並使其更加模塊化和整潔。

從代碼片段中看不清楚,但我會假設您使用的是UnityScript。

在腳本當你點擊在芯片上,插入該行處理的觸摸代碼:

hit.transform.SendMessage("Spin", hit.transform, SendMessageOptions.DontRequireReceiver); 

將這個代碼在一個名爲「SpinChip」一個單獨的腳本,然後將腳本添加到您的芯片對象。

var StartSpeed = 360.0; 
var Deceleration = 3.0; 

function Spin() 
{ 
    if (Animating) 
    { 
     print("Chip is already spinning, not starting another animation"); 
     return; 
    } 

/* 
    This code isn't necessary if this exists in a separate script and is only ever attached to the clickable chip 
    if (!gameObject.tag.Contains("Chip")) 
    { 
     print("That wasn't a chip you clicked"); 
     return; 
    } 
*/ 

    print("Chip has been told to spin"); 
    StartCoroutine(SpinningAnimation); 
} 

function SpinningAnimation() 
{ 
    print("Chip spin start"); 
    transform.localRotation = Quaternion.identity; 
    Speed = StartSpeed; 
    Animating = true; 
    while (Speed > 0) 
    { 
     transform.Rotate(0, Speed*Time.deltaTime, 0); 
     Speed -= Deceleration; 
     yield; // wait one frame 
    } 

    print("Chip has completed the spin"); 
    Animating = false; 
} 

這段代碼的作用是創建一個啓動時會旋轉的芯片,你每次更新循環運行一次協同例程,且獨立於您的實際點擊按鈕的代碼。

0
var rotSpeed: float = 60; // degrees per second 

function Update(){ 
    transform.Rotate(0, rotSpeed * Time.deltaTime, 0, Space.World); 
} 

這裏是旋轉你的遊戲對象的代碼,你可以用向量3使用它:transform.Rotate(x, y, z);或空間transform.Rotate(x, y, z, Space.World); rotSpeed是轉速。

+0

你的答案不是問題的答案。該問題描述了一個不同的問題。 – Joetjah

+0

對不起,我會再次閱讀這個問題。 – 2013-08-10 15:02:58

0

在您的更新功能。 Bool變量Animate可能會變爲真。這可能是你的氣缸繼續旋轉的原因。

其他解決方法是:您可以創建您的氣缸動畫,然後採取秒錶。因此,在某段時間後,您可以使用秒錶的時間停止動畫