Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unity3d 数学:如何通过拖动旋转车轮&;放置(画布,2D)?_Unity3d_Drag And Drop - Fatal编程技术网

Unity3d 数学:如何通过拖动旋转车轮&;放置(画布,2D)?

Unity3d 数学:如何通过拖动旋转车轮&;放置(画布,2D)?,unity3d,drag-and-drop,Unity3d,Drag And Drop,我很难用简单的数学来用拖放来旋转轮子 画布(Unity UI)中有一个径向布局,通过设置一个名为StartAngle的属性(范围为0-360),可以旋转该布局。在这个半径中有项目,因此StartAngle用于第一个项目,并将所有子元素放置在布局半径周围 我想为这些项目实现拖放,这样你就可以拖动一个子项,并且径向线将相应地旋转(无限) 现在,我有一个出发点: public void OnDrag(PointerEventData eventData) { var delta = event

我很难用简单的数学来用拖放来旋转轮子

画布(Unity UI)中有一个径向布局,通过设置一个名为StartAngle的属性(范围为0-360),可以旋转该布局。在这个半径中有项目,因此StartAngle用于第一个项目,并将所有子元素放置在布局半径周围

我想为这些项目实现拖放,这样你就可以拖动一个子项,并且径向线将相应地旋转(无限)

现在,我有一个出发点:

public void OnDrag(PointerEventData eventData)
{
    var delta = eventData.delta.x * Time.deltaTime;
    var newAngle = radialLayout.StartAngle + delta;
    if (newAngle >= 360)
        newAngle = newAngle - 360;
    else if (newAngle < 0)
        newAngle = Mathf.Abs(360 - newAngle);
    radialLayout.StartAngle = newAngle;
}

我不知道你所有的代码和类型,但我有一个想法。我现在不能测试它,也不能保证它能像这样工作,但我希望这个想法变得清晰


我可能更愿意用像这样的东西

//这是从对象中心到鼠标/触摸位置的向量
//(在屏幕像素空间中)
var touchDirection=eventData.position-Camera.main.WorldToScreenPoint(transform.position);
//上(Y)轴与该接触方向之间的角度
//对于角度,上方向向量的长度无关紧要,所以有
//无需将其转换为像素空间
var targetAngle=Vector2.SignedAngle(Vector2.up,touchDirection);
//因为返回的角度可能为负,所以将其包裹以获得0-360的值
如果(targetAngle<0)targetAngle+=360;
//现在,要么简单地使用Lerp
//这将简单地将每个帧插值到两个值的中间
//结果是开始时动作很快,结束时动作很慢
radialLayout.StartAngle=Mathf.Lerp(radialLayout.StartAngle,targetAngle,0.5f);
//或者使用固定速度,如30°/秒
var差=目标角-半径yout.StartAngle;
radialLayout.StartAngle+=数学符号(差)*数学最小值(30f*时间增量,数学绝对值(差));


在智能手机上输入,但我希望这个想法变得清晰

如果应用程序错误地猜测用户如何尝试与径向菜单(旋转/线性)交互,可能会让用户大惑不解。考虑选择一种交互方式和代码,或者可选地有一个布尔值来决定它是如何解释的,玩家可以选择他们喜欢线性或自旋交互。
public void OnDrag(PointerEventData eventData)
{
    // Note the "Head-Minus-Tale rule for Vector subtraction, see http://www.maths.usyd.edu.au/u/MOW/vectors/vectors-3/v-3-7.html
    //  vSourceToDestination = vDestination - vSource;

    // First, we draw a vector from the center point of the radial to the point where we started dragging
    var from = dragStartPoint - (Vector2)radialLayout.transform.position;
    // Next, we draw a vector from the center point of the radial to the point we are currently dragging on
    var to = eventData.position - (Vector2)radialLayout.transform.position;
    // Now, we calculate the angle between these two: 
    var dragAngle = Vector2.SignedAngle(from, to);

    // Lerping makes movement fast at the beginning slow at the end
    var lerpedAngle = Mathf.Round(Mathf.LerpAngle(radialLayout.StartAngle, dragAngle, 0.5f));
    radialLayout.StartAngle = lerpedAngle;
}