对于我的程序,我正在编写一个“类似时钟”的行为。意思是我
- 将一些图片围成一圈(作品)
- 如果我单击并拖动任何项目,所有项目都应随鼠标旋转(有效)
但是我遇到了一个奇怪的错误。我第一次单击并按住鼠标时,我的图像“跳”到不同的位置。如果我按住鼠标,我可以很好地旋转我的时钟。 当我使用 MouseUp 并从同一图像开始拖动时,效果很好。如果我转到另一张图片,我会再次出现此“跳转”。
当我的时钟上只有几张图片时,我发现它没有跳动。但起始位置似乎偏离了。 当我只有一个项目时,我可以将它旋转一圈,但是当我开始旋转时它会跳离我的鼠标,然后我可以根据需要旋转它。
对我来说,第一次拖动项目时,这似乎是一个错误的“起点”。因为当我一次又一次地拖动同一个项目时它工作正常。 不幸的是我找不到那个该死的错误,我已经搜索了一整天了。
#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();
}
我的拖动事件开始时的“跳跃”消失了,但拖动的速度与我的鼠标不相上下。 我离阻力的起点越近,它移动得越快,距离我越远,它就越慢。 我不知道这是否让我离解决方案更近了还是更远了:(
编辑2: 好吧,我认为问题可能是我的计算都是从中心角度作为 0,0 点完成的。 Unity 的左下角为 0,0。所以我必须先翻译所有这些坐标...
最佳答案
所需要的只是转换为卡氏坐标
//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);
和增量的加法而不是减法
PanelPrefab.anchoredPosition = new Vector2(radius * Mathf.Sin(CalculateCircleAngle(i) + deltaRadian),radius * Mathf.Cos(CalculateCircleAngle(i) + deltaRadian));
关于c# - 单位圆计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32532892/