【问题标题】:UNITY Rigidbody causing my gameobject to continuously move coordinatesUNITY Rigidbody 导致我的游戏对象不断移动坐标
【发布时间】:2018-04-19 01:00:19
【问题描述】:

我在0, 1 ,0 放置了一个立方体,并且在测试后启动程序后,我发现刚体的重力导致我的立方体在程序中实际上没有移动时不断地围绕坐标移动。

我可能完全没有点击,它会说它正在移动 +-5 个单位。它在一个完全平坦的表面上。我已经超越了困惑。 http://prntscr.com/j75fed

我可以确认它从0, 0, 0开始

using System.Collections;
using UnityEngine;

public class TumblingCubes : MonoBehaviour
{

    public float tumblingDuration = 0.2f;

    void Update()
    {
        var dir = Vector3.zero;

        if (Input.GetKey(KeyCode.UpArrow))
            dir = Vector3.forward;

        if (Input.GetKey(KeyCode.DownArrow))
            dir = Vector3.back;

        if (Input.GetKey(KeyCode.LeftArrow))
            dir = Vector3.left;

        if (Input.GetKey(KeyCode.RightArrow))
            dir = Vector3.right;

        if (dir != Vector3.zero && !isTumbling)
        {
            StartCoroutine(Tumble(dir));
        }
        var vec = transform.eulerAngles;

        transform.eulerAngles = vec;

    }

    bool isTumbling = false;
    IEnumerator Tumble(Vector3 direction)
    {
        var vec = transform.eulerAngles;

        transform.eulerAngles = vec;
        isTumbling = true;

        var rotAxis = Vector3.Cross(Vector3.up, direction);
        var pivot = (transform.position + Vector3.down * 0.5f) + direction * 0.5f;

        var startRotation = transform.rotation;
        var endRotation = Quaternion.AngleAxis(90, rotAxis) * startRotation;

        var startPosition = transform.position;
        var endPosition = transform.position + direction;

        var rotSpeed = 90 / tumblingDuration;
        var t = 0.0f;

        while (t < tumblingDuration)
        {
            t += Time.deltaTime;
            transform.RotateAround(pivot, rotAxis, rotSpeed * Time.deltaTime);
            yield return null;
        }

        transform.rotation = endRotation;
        transform.position = endPosition;



        isTumbling = false;



    }


}

这是附加到立方体的唯一脚本,除了刚体

禁用脚本后,这就是你的结果,???奇怪的坐标http://prntscr.com/j75htl

【问题讨论】:

  • 这与 c# 有什么关系?提示:不是。您将在 Unity 论坛上获得更好的答案,这是用于编程问答
  • 我只能假设它与您的脚本有关,您可以在您的问题中添加任何相关的脚本吗?有什么东西可以移动立方体?
  • @NyW,我现在更新不好
  • 你的脚本没有问题,我只是做了一个例子来测试它,它工作正常。唯一的区别是我对立方体失去了重力。还有什么可能影响立方体的吗?
  • @nyw 是的,你是对的,当我关闭重力时,它确实有效。但我需要它,因为立方体需要工作重力才能从孔中掉下来。当你开启重力时你会得到什么?

标签: c# unity3d gameobject


【解决方案1】:

我认为最终的答案是因为你的物理材料。由于摩擦力太低,立方体只是滑过该区域。您可以通过两种方式修复这两种方法,如果您将材质从它所附着的任何东西上取下来,或者如果您在检查器中的 Rigidbody > Constraints > Freeze Rotation 下冻结立方体的旋转。第二个选项不会阻止您的代码工作。

希望这会有所帮助!

【讨论】:

  • 感谢您的所有帮助,这真的很奇怪,因为它仍然无法正常工作。冷冻后,这是我得到的prntscr.com/j75zyx
  • 你截图中的那些值真的很小——这仍然是个问题吗?对于大多数用途,更改 +- 0.000001 应该没问题,因为它不可见。 (我看不到完整值,但看起来 y 值为 -1.151... * 10^-7 ?)
  • 我很确定它必须是完美的,但我更关注的是位置而不是旋转。它让我感到困惑,它如何不断地转移到全面的单位?_?
  • 你肯定需要物理材料吗?或者您出于某种原因需要低摩擦力?
  • 更新,所以我得到了它的所有工作。所有不起作用的是 .000001 阻止它正常工作。我不明白它冻结时是如何旋转的??
【解决方案2】:

我和一个有对撞机的孩子和一个有他自己的父母相交的孩子也有同样的情况 对撞机;所有约束都冻结但仍然是微小的移动,例如 -0.002... 我丑陋的“解决方案”: transform.localRotation = Quaternion.identity;在更新()!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多