【问题标题】:Unity find the centre point selected circle segmentunity 找圆心点选圆段
【发布时间】:2019-08-16 00:02:15
【问题描述】:

我有一个可以用鼠标拖动来旋转的转盘。我在public void OnDrag(PointerEventData eventData) 中使用transform.rotation = finalRotation; 来旋转表盘。

我想将转盘分成 28 段,当用户放开鼠标时,我想将转盘移动到该段的中心。

线段的中心度数为

段位:[ 0, 12, 25, 37.5, 50, 62.3, 75.35、88.5、100.8、114、127、140、 153、166.5、180、193、206、219、 232、245、258.2、271.4、283.8、 297、309.5、322、334.2、347]

例如,如果我将刻度盘移动到 10 的 transform.rotation.z,那么刻度盘将设置为第一段,因此我会将位置捕捉到中心标记,即 12

【问题讨论】:

    标签: c# unity3d


    【解决方案1】:

    您可以将要捕捉到的段位置存储在一个数组中,然后使用 LINQ 循环遍历该位置,并将其放入一个方法中,该方法返回您在拖动结束时调用的最近段。

    using System.Linq; //don't forget to include LINQ
    
    //Define the points you want to snap to
    float[] segmentPositions = new float[28] { 0f, 12f, 25f, 37.5f, 50f, 62.3f, 75.35f, 88.5f, 100.8f, 114f, 127f,
                                            140f, 153f, 166.5f, 180f, 193f, 206f, 219f, 232f, 245f, 258.2f, 271.4f,
                                            283.8f, 297f, 309.5f, 322f, 334.2f, 347f };
    
    void Start()
    {
        //Get the closest segment based on the current z rotation
        //rotation.z is in radians. Since we defined our snapping points in degrees we need to 
        //convert using Matf.Rad2Deg.
        var newZRotation = GetClosestSegment(transform.rotation.z * Mathf.Rad2Deg); 
    
        //Alternatively we can pass in the localEulerAngles instead
        var newZRotation = GetClosestSegment(transform.localEulerAngles.z);
        //Apply the z rotation to your object here
    }
    
    private float GetClosestSegment(float input)
    {
        //Get the closest point inside segmentPositions and return it
        return segmentPositions.OrderBy(s => Mathf.Abs(s - input)).First();
    }
    

    请注意,如果 Array 为空,这将引发空引用。所以如果你不能保证数组总是被填充,请确保你执行一个空检查

    【讨论】:

    • 我认为您可以在这里简单地使用First ...如果此数组中有元素,它们将始终具有有效值(float 始终具有默认值0)跨度>
    • 谢谢你,不幸的是我现在只返回 0 不管transform.rotation.z
    • @KeithPower 你确定你提供的transform.rotation.z 不是空的吗?要对其进行测试,请尝试给它一个像GetClosestSegment(10) 这样的静态数字,它应该返回 12。请记住,它会发送它所附加的脚本对象的 z 值。如果那不是您要旋转的对象,请确保您提供旋转对象的 z 旋转 gyazo.com/056a514975d5d3a02c20f6722c89b0e5
    • 肯定会得到 transform.rotation.z 的值,例如 0.1048443。我尝试传入GetClosestSegment(10),确实得到了 12
    • @KeithPower Well 0.104 最接近 0,因此返回 0 是有道理的。可能是它使用弧度而不是度数(捕捉点以度数定义) 0.104 弧度约为5.95度。尝试传递transform.rotation.z * Mathf.Rad2Deg(弧度到度)或使用GetClosestSegment(transform.localEulerAngles.z),因为eulerAngles 应该以度为单位
    猜你喜欢
    • 2016-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-10
    • 2020-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多