C# 立方体的完全旋转

C# 立方体的完全旋转,c#,unity3d,C#,Unity3d,我现在有一个脚本来移动我的“玩家”在一个表面上,但我发现它非常无效,立方体从左到右上下摆动。有没有人有关于如何移动立方体的好笔记,可以左右翻转,而不晃动或其他什么。每次都能完美地移动吗?我的最后一个会移动到2.000231之类的点。它真的很模糊,因为我想让它完美,这样它就可以放进洞里了。他就是我用的剧本。如果你有更好的,请包括ty 使用系统集合; 使用UnityEngine public class TumblingCubes : MonoBehaviour { public floa

我现在有一个脚本来移动我的“玩家”在一个表面上,但我发现它非常无效,立方体从左到右上下摆动。有没有人有关于如何移动立方体的好笔记,可以左右翻转,而不晃动或其他什么。每次都能完美地移动吗?我的最后一个会移动到2.000231之类的点。它真的很模糊,因为我想让它完美,这样它就可以放进洞里了。他就是我用的剧本。如果你有更好的,请包括ty 使用系统集合; 使用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));
        }

    }

    bool isTumbling = false;
    IEnumerator Tumble(Vector3 direction)
    {
        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.0f, rotAxis) * startRotation;

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

        var rotSpeed = 90.0f / 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;

    }

}
公共类TumblingCubes:单行为
{
公共浮动翻滚持续时间=0.2f;
无效更新()
{
var dir=向量3.0;
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)
{
开始例行程序(翻滚(直飞));
}
}
bool-isTumbling=false;
IEnumerator翻滚(矢量3方向)
{
isTumbling=true;
变量旋转轴=矢量3.交叉(矢量3.向上,方向);
变量轴=(transform.position+Vector3.down*0.5f)+方向*0.5f;
var startRotation=transform.rotation;
var endRotation=四元数角度轴(90.0f,旋转轴)*开始旋转;
var startPosition=transform.position;
var endPosition=变换位置+方向;
var旋转速度=90.0f/旋转持续时间;
var t=0.0f;
while(t
您的脚本应该工作正常,因为浮点数的存储方式,您总是会有小错误。但是你不应该有像你一样大的错误

您确定多维数据集是从(0,0,0)开始的吗? 无论如何,你可以肯定,如果你把这个在最后翻滚

    var vec = transform.eulerAngles;
    vec.x = Mathf.RoundToInt(vec.x / 90 * 90);
    vec.y = Mathf.RoundToInt(vec.y / 90 * 90);
    vec.z = Mathf.RoundToInt(vec.z / 90 * 90);
    transform.eulerAngles = vec;

请停止重新发布,你只需要发布一次。我很困惑,piror运行程序,立方体在0,0,0,一旦我启动它,它实际上没有显示移动,但它说它到处移动,坐标恒定移动,但立方体实际上没有移动…?我应该把你的密码放在这里吗而(t