【问题标题】:How do I make an object rotate half as fast as another?如何使一个对象的旋转速度是另一个对象的一半?
【发布时间】:2019-05-13 07:30:51
【问题描述】:

我有一个齿轮,用户可以转动它来旋转吊桥。目前我的齿轮和吊桥以相同的速度旋转,如下所示:https://gyazo.com/14426947599095c30ace94a046e9ca21

这是我当前的代码:

[SerializeField] private Rigidbody2D thingToRotate;
    void OnMouseDrag()
    {
        Vector3 mousePosition = Input.mousePosition;
        mousePosition = Camera.main.ScreenToWorldPoint(mousePosition);

        Vector2 direction = new Vector2(
            mousePosition.x - transform.position.x,
            mousePosition.y - transform.position.y
         );

        transform.right = direction;
        thingToRotate.transform.up = transform.right;

    }

基本上它获取鼠标位置,计算鼠标和吊桥之间的距离,然后根据矢量设置角度。问题是吊桥角度与齿轮相同。

我想要这样当用户转动齿轮时它只会转动对象一点点,所以用户可以在吊桥关闭之前转动齿轮几次。

我尝试增加吊桥的欧拉角。我尝试将吊桥旋转设置为齿轮旋转并将该旋转除以 2。

是否有根据另一个角度设置角度的功能?甚至是一种将旋转设置为比率或其他方式的方法?

【问题讨论】:

    标签: c# unity3d


    【解决方案1】:

    您需要计算当前方向和拖动方向之间的角度,乘以您的比率(即 0.5),然后将其转换为矢量。

    float ratio = 0.5f;
    
    float ang = ratio * Mathf.Deg2Rad * Vector2.Angle(transform.right, direction);
    
    thingToRotate.transform.up += new Vector2(Mathf.Cos(ang), Mathf.Sin(ang));
    

    这将使您的代码看起来像:

    public float ratio = 0.5f;
    
    [SerializeField] private Rigidbody2D thingToRotate;
    void OnMouseDrag()
    {
        ...
    
        float ang = ratio * Mathf.Deg2Rad * Vector2.Angle(transform.right, direction);
    
        thingToRotate.transform.up += new Vector2(Mathf.Cos(ang), Mathf.Sin(ang));
    
        transform.right = direction;
    }
    

    【讨论】:

      猜你喜欢
      • 2016-06-13
      • 2020-07-04
      • 2015-11-20
      • 1970-01-01
      • 1970-01-01
      • 2013-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多