Unity 3D旋转游戏对象

时间:2012-05-16 01:19:27

标签: animation unity3d unityscript

我正试图统一旋转3D Gameobject。它实际上是一个只有扑克筹码纹理的圆柱体。一旦它与光线投射相撞,我想将其旋转360度。它在Unity仿真器中运行得很好,但是,在设备本身上,芯片在旋转后停止,然后继续在无限循环中旋转。以下是相关代码的片段。感谢您提前提供任何帮助。

    // 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);
    }   
}

为了总结这一点,我可以在游戏对象芯片发生碰撞时分配给它最好的

// Set the chip
    Chip = hit.transform;

一切都在更新功能中完成。一旦光线投射命中它就会调用一个投注功能,然后在计算投注后,它会将布尔Animate更改为true,从而导致芯片旋转。

4 个答案:

答案 0 :(得分:0)

有些东西在其他代码中设置Animate = true,很难说明没有看到剩下的代码。

在Animate设置为true的每个位置旁边放置一些调试,你应该看到设置它的其他东西,只能解释为什么它继续旋转。

另一种选择是使用动画工具,而不是旋转,你只需播放为你执行旋转的动画。

编辑:触摸代码周围的机会,导致您在编辑器中使用击键调试时。我经历了几次陷入困境。

答案 1 :(得分: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;
}

这段代码的作用是创建一个协同例程,在激活后每个更新循环运行一次,为您旋转芯片,并且与您实际的按钮点击代码无关。

答案 2 :(得分: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是转速。

答案 3 :(得分:0)

在您的更新功能中。 Bool变量Animate可能会成为现实。这可能是您的气缸继续旋转的原因。

其他解决方案是:您可以创建圆柱体的动画,然后使用秒表。所以在一段时间之后你可以使用秒表的时间停止动画