2017-10-05 142 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和东西,但这应该让你开始)。