Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/338.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
C# 检查触摸区域时,触摸缓慢_C#_Android_Unity3d_Drag And Drop - Fatal编程技术网

C# 检查触摸区域时,触摸缓慢

C# 检查触摸区域时,触摸缓慢,c#,android,unity3d,drag-and-drop,C#,Android,Unity3d,Drag And Drop,我有一个名为TouchDragDrop.cs的脚本,它允许我在2D空间中触摸和拖动一个对象 我想展示的两个功能是: void Update() { if (Input.touchCount > 0) { Touch touch = Input.GetTouch(0); // touchPosition = touch.position; touchPosition = Camera.main.ScreenToWorldPoi

我有一个名为TouchDragDrop.cs的脚本,它允许我在2D空间中触摸和拖动一个对象

我想展示的两个功能是:

void Update()
{
    if (Input.touchCount > 0)
    {
        Touch touch = Input.GetTouch(0);
        // touchPosition = touch.position; 
        touchPosition = Camera.main.ScreenToWorldPoint(touch.position);

        switch (touch.phase)
        {
            case TouchPhase.Began: beginTouchMove();  break;
            case TouchPhase.Moved: moveTouch();  break;
            case TouchPhase.Stationary: stationaryTouch(); break;
            case TouchPhase.Ended: endTouchMove();  break;
        }

    }
}

private void moveTouch()
{
    //if ((myCollider2D == Physics2D.OverlapPoint(touchPosition)) && (isMoving))
    if(isMoving)
    {
        Vector2 newPosition = new Vector2(touchPosition.x - deltaX, touchPosition.y - deltaY);
        //gameObject.transform.position = newPosition;
        myRigidbody2D.MovePosition(newPosition);
        //if(debuglog) Debug.Log("Touch Position:  x: " + touchPosition.x.ToString() + " y: " + touchPosition.y.ToString());
        //if(debuglog) Debug.Log("RigidBody: " + myRigidbody2D.position.ToString());
    }
}
现在,为了准确地移动物体,我需要确保触摸位于物体的顶部,这就是我最初使用线条的原因:

if((myCollider2D==Physics2D.OverlapPoint(touchPosition))&(isMoving))

但这会使应用程序速度减慢,以至于拖动是一项艰巨的工作,就像我真的必须缓慢地按住并拖动才能让角色与我一起移动一样。所以,如果我把它拿出来,只要有
if(isMoving)
它又快了


如何确保只拖动对象而不是屏幕上的一小部分?

我只能假设您有许多对象运行此脚本,这就是导致问题的原因。要验证这一点,请尝试将具有TouchDragDrop组件的对象数减少到总共1或2个对象。你可能会注意到游戏不再慢了

每次触摸屏幕时,所有带有TouchDragDrop.cs脚本的对象都在读取输入,然后执行其moveTouch逻辑。如果有50个附着了TouchDragDrop.cs的对象,则将执行Physics2D.OverlapPoint 50次。这可能会扼杀你的表现

Physics2D.OverlapPoint只能调用一次。如果许多对象需要对触摸作出响应,请考虑将输入和触摸逻辑移动到只负责读取输入并返回碰撞器的单个游戏对象。然后将您的“移动逻辑”移动到另一个脚本(可能称为Draggable.cs),而不是对每个游戏对象进行比较,您可以从单个输入脚本执行以下操作:

touchPosition = Camera.main.ScreenToWorldPoint(touch.position);
Collider2D touchedCollider = Physics2D.OverlapPoint(touchPosition)
Draggable dragObj = touchedCollider?.GetComponent<Draggable>();
dragObj?.MoveTouch(touchPosition);

然后,您可以保持MoveTouch()逻辑与上面相同,只需检查(isMoving).

您在哪里定义isMoving?有多少个对象附加了此脚本?它在beginTouchMove中被定义为true,在endTouchMove中被设置为false。一次这些对象不超过10个,它只从一个开始,而只有一个很慢。如果您只有一个带有脚本附件的对象d、 它仍然非常慢?谢谢你的回答!但是当游戏开始时,只有一个对象附加了这个脚本。那么你的另一个问题可能是你在更新周期中不断更新你的触摸位置,但是物理位置没有更新。你的帧速率没有下降,是吗?@chud37我不知道如何更新检查android上的帧速率。这就像我的第二个unity应用程序lol!@Chud37。我已经用一些附加信息更新了我的答案。
void BeginTouchMove()
{
    if(myCollider2D == Physics2D.OverlapPoint(touchPosition))
    {
        isMoving = true;
    }
}