Unity Circle计算

时间:2015-09-11 22:15:01

标签: c# unity3d geometry

我的程序即时编程"时钟就像"行为。意思是我

  • 订购一些圆形图片(作品)
  • 如果我点击并拖动任何项目,所有项目都应该用鼠标旋转(工作)

但我得到一个奇怪的错误。我第一次点击并按住鼠标我的图像"跳转"到不同的位置。如果我按住鼠标,我可以旋转我的时钟。 当我使用MouseUp并从同一图像启动dragin时效果很好。如果我去另一张图片,我会得到这个" Jump"试。

当我的时钟上只有几张图像时,我发现它并没有跳跃。但是起始位置似乎已经消失了。 当我只有一个项目时,我可以将它旋转一圈,但是当我开始旋转时,它会跳离我的鼠标而不是我可以根据需要旋转它。

对我来说,它似乎是一个错误的起点"第一次拖动项目时当我比一次又一次地拖动相同的项目时,它运行正常。 不幸的是,我找不到该死的虫子,而且我已经整天搜索了。

public void SetLayoutHorizontal ()
{
    Debug.Log ("LAYOUT");

    for (var i =0; i < Rect.childCount; i++)
    {
        var PanelPrefab = Rect.GetChild (i) as RectTransform;

        Transform ImageObject = PanelPrefab.GetComponentInChildren<Transform>().Find("Image");

        if (PanelPrefab == null)
            continue;

        PanelPrefab.sizeDelta = CellSize;
        PanelPrefab.anchoredPosition = new Vector2(radius * Mathf.Sin( CalculateCircleAngle(i) - deltaRadian),radius * Mathf.Cos(CalculateCircleAngle(i) - deltaRadian));

    }

}

private float CalculateCircleAngle(int parts)
{
    //parts == Number of parts the whole circle is to be cut into
    return parts * (360/Rect.childCount) * (Mathf.PI/180);
}

public void OnDrag (PointerEventData eventData)
{
    var diffX = eventData.position.x - _rect.rect.width/2; // MouseX - CenterScreenX
    var diffY = eventData.position.y - _rect.rect.height/2; // MouseY - CenterScreenY
    deltaRadian = Mathf.Atan2(diffY,diffX);

    SetDirty();

}

编辑:

好的我编辑了代码,但它仍然无效。 我添加了以下方法:

public void OnBeginDrag(PointerEventData eventData)
{
    originalX = eventData.position.x;
    originalY = eventData.position.y;

}

我依次更改了拖拽方法

public void OnDrag (PointerEventData eventData)
{

    var diffX = eventData.position.x - originalX;
    var diffY = eventData.position.y - originalY;
    deltaRadian = Mathf.Atan2(diffY,diffX);

    SetDirty();

}

&#34;跳跃&#34;在我的拖动事件开始时消失了,但是拖动的速度与我的鼠标不相上下。 我越接近拖拽的起点,移动得越快,距离越远,越慢。 我不知道这是否让我更接近解决方案或更远:(

EDIT2: 好吧我认为问题可能是我的计算都是从中心角度完成的0,0点。 Unity的左下角为0,0。所以我不得不首先翻译所有那些coordiantes ...

3 个答案:

答案 0 :(得分:1)

所需要的只是转向kartesian坐标

//Convert to kartesian coordinates with 0,0 in center of screen
    var diffX = (eventData.position.x - _rect.rect.width / 2) % (_rect.rect.width / 2);
    var diffY = (eventData.position.y - _rect.rect.height / 2) % (_rect.rect.height / 2);

并添加delta而不是减法

PanelPrefab.anchoredPosition = new Vector2(radius * Mathf.Sin(CalculateCircleAngle(i) + deltaRadian),radius * Mathf.Cos(CalculateCircleAngle(i) + deltaRadian));

答案 1 :(得分:0)

您的鼠标坐标是相对于您单击的控件。您可以使用控件在其容器中的位置重新计算它们,或者使用绝对坐标。

答案 2 :(得分:0)

我不认为您正在显示所有相关代码,但您的OnDrag功能,特别是diffX和diffY可能为您提供答案。

我相信你会选择所选位置的绝对坐标,然后用它们来生成你的角度 - 这意味着你点击的几乎任何地方都是一个很大的跳跃,但是设置了当前的角度。您的初始点击处理程序应该保存起始坐标,并且您的OnDrag应根据您从该保存位置拖动的距离将自身与该初始坐标进行比较。