2017-10-05 144 views
7

我有一個半圓形的遊戲對象,我通過在空的遊戲對象(SCircle)中放置兩個弧並旋轉15°(左弧)和-15°(右弧),如下所示。如何在使用協程將一個子對象旋轉到一定角度時旋轉一個父對象

enter image description here

SCircle具有Orientation枚舉與兩個值Left(旋轉SCircle至45°)和Right(旋轉SCircle至-45°)所看到下面在圖像中。

enter image description here

我用下面的協程,以方位之間移動SCircle

IEnumerator RotateLeftOrRight(Vector3 byAngles, float inTime) 
{ 
    Quaternion fromAngle = gameObject.transform.rotation ; 
    Quaternion toAngle = Quaternion.Euler (transform.eulerAngles); 


    if (circOrientation == Orientation.Left) { 
     toAngle = Quaternion.Euler (gameObject.transform.eulerAngles - byAngles); 
     circOrientation = Orientation.Right; 

    } 
    else if (circOrientation == Orientation.Right) { 

     toAngle = Quaternion.Euler (gameObject.transform.eulerAngles + byAngles); 
     circOrientation = Orientation.Left; 
    } 


    for(float t = 0f ; t <= 1f ; t += Time.deltaTime/inTime) 
    { 
     gameObject.transform.rotation = Quaternion.Lerp(fromAngle, toAngle, t) ; 
     yield return null ; 

    } 
    gameObject.transform.rotation = Quaternion.Lerp(fromAngle, toAngle, 1); 
} 

我也使用非常相似的協程30°從比方說,取向Left移動個人弧(在相反方向上),如在協程和圖像下方觀察:

IEnumerator RotateArc(GameObject arcGO, Vector3 byAngles, float inTime) 
{ 
    Quaternion fromAngle = arcGO.transform.rotation ; 
    Quaternion toAngle = Quaternion.Euler (arcGO.transform.eulerAngles); 

    if (rightArc.arcOrientation == Arc.Orientation.Down) { 
     toAngle = Quaternion.Euler (arcGO.transform.eulerAngles + byAngles); 
     rightArc.arcOrientation = Arc.Orientation.Up; 

    } 
    else if (rightArc.arcOrientation == Arc.Orientation.Down) { 

     toAngle = Quaternion.Euler (arcGO.transform.eulerAngles - byAngles); 
     rightArc.arcOrientation = Arc.Orientation.Up; 
    } 


    for(float t = 0f ; t <= 1f ; t += Time.deltaTime/inTime) 
    { 
     arcGO.transform.rotation = Quaternion.Lerp(fromAngle, toAngle, t) ; 
     yield return null ; 

    } 
    arcGO.transform.rotation = Quaternion.Lerp(fromAngle, toAngle, 1); 

} 

enter image description here

由於SCircle協程是通過鼠標點擊激活的,我有個別圓弧協程運行的情況,並且在它完成之前父協程是也跑。在這種情況下,弧線從Left最終移動到A,這不是我需要的行爲。當從Left移動時,我希望它們的行爲在B處結束。同樣,從B開始,當協調程序在弧進程正在運行的同時運行時,方向將返回到Left

請注意,藍色箭頭表示左側弧的移動,紅色表示右側弧,黑色表示SCircle - 父對象的移動。

enter image description here

+1

可以肯定的是,您想要同時移動這兩個弧線但方向不同,並且您還希望移動在同一時間結束?如果是,哪個對象是另一個對象的父對象? – Programmer

+0

@Programmer SCircle是父對象,由包含左右弧的空對象創建。我不希望運動同時結束,因爲子圓弧的旋轉協程在父SCcclecle的旋轉協程之前開始。因此,子弧旋轉應該在父項之前結束。只有當兩個協同程序同時運行時纔會有一個時間點。一般來說,每個協程都應該是時候了。 – Bane

+0

請向我們展示將弧線旋轉30度的代碼。你是否設置了弧線而不是局部旋轉? – lockstock

回答

0

我相信你所遇到的問題是事實,當你旋轉每個電弧,他們繞着什麼也旋轉本身引起的。

換句話說,您的SCircle的軸正在旋轉,並且您的圓弧正在使用這些相同的軸來確定它們自己的旋轉。所以,如果你看看你的例子A,你告訴它在世界空間中旋轉-90,然後立刻告訴在世界空間中旋轉30。爲了解決這個問題,你想讓弧線在本地旋轉,而不是在世界空間。

我想你可以通過設置這個結構解決這個問題:

空遊戲對象SCircle

------空遊戲對象BlueArcCenter - >位置0,0,0

- ---------藍色圓弧 - >在這裏改變位置,使它從零偏移ex:(radius,0,0)

------空的gameObject RedArcCenter - > position(0, 0,0)

-----------紅弧 - >這裏改變位置,使其從零偏移恩:( - 半徑,0,0)

現在改變你的代碼,以便:

要單獨旋轉藍色和紅色圓弧,請旋轉arcCenters,

要旋轉整個配置,請旋轉SCircle。這將依次旋轉兩個圓弧,這將依次旋轉兩個圓弧,而不管它們相對於彼此如何取向,或者它們自身是否旋轉。

注: 另外,我讀過的人都在用四元數少了很多,這些天,因爲他們並沒有真正意義,當你閱讀的代碼。您可能想要將代碼更改爲正常旋轉以使其更具可讀性。

如果您已經安裝上面列出,使用類似:

旋轉圈:

thisSCircle.transform.Rotate(0, -90, 0, Space.Self); 

旋轉弧線繞其公共中心:

blueArcCenter.transform.Rotate(0, -30, 0, Space.Self) 
redArcCemter.transform.Rotate(0, 30, 0, Space.Self) 

(你會需要添加lerps和東西,但這應該讓你開始)。