我正试图统一旋转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,从而导致芯片旋转。
答案 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可能会成为现实。这可能是您的气缸继续旋转的原因。
其他解决方案是:您可以创建圆柱体的动画,然后使用秒表。所以在一段时间之后你可以使用秒表的时间停止动画