如何准确知道用户何时触摸BoxCollider2D

时间:2016-08-19 17:35:48

标签: c# unity3d collision-detection unity5

我想在每次用户触摸附有BoxCollider2D的GameObject时在Android设备上进行检测,以便每次都可以执行代码。

在我的情况下,用户多次滑动GameObject,因此他们可能不会将手指从屏幕上抬起,直到他们需要或满足特定条件。

以下是一个示例图片:

Case example

2 个答案:

答案 0 :(得分:1)

  

用户可能会多次滑过GameObject   不要将手指从屏幕上抬起,直到他们需要或特定   条件得到满足。

由于用户不需要从屏幕上移除手指,因此您可以使用TouchPhase.MovedRaycastHit2D检查是否在2D GameObject上滑动。 TouchPhase.Began应仅用于检测触摸。

void Update()
{
    //Check for Press
    for (int i = 0; i < Input.touchCount; i++)
    {
        if (Input.GetTouch(i).phase == TouchPhase.Began)
        {
            Vector2 fingerRay = Camera.main.ScreenToWorldPoint(Input.GetTouch(i).position);
            RaycastHit2D objectHit = Physics2D.Raycast(fingerRay, Vector2.zero);
            if (objectHit)
            {
                //We hit something
                if (objectHit.collider.name == "myGameObjectName")
                {
                    Debug.Log("Touched Finger on GameObject: " + objectHit.collider.name);
                }
            }
        }

        //Check if we moved the finger(while press is still down)
        if (Input.GetTouch(i).phase == TouchPhase.Moved)
        {
            Vector2 fingerRay = Camera.main.ScreenToWorldPoint(Input.GetTouch(i).position);
            RaycastHit2D objectHit = Physics2D.Raycast(fingerRay, Vector2.zero);
            if (objectHit)
            {
                //We hit something while moving the finger
                if (objectHit.collider.name == "myGameObjectName")
                {
                    Debug.Log("Moved Finger on GameObject: " + objectHit.collider.name);
                }
            }
        }

        //Check for release
        if (Input.GetTouch(i).phase == TouchPhase.Ended)
        {
            Debug.Log("Released Finger!");
        }
    }
}

修改

  

代码没有检测到GameObject上的所有滑动。有用   只有当你在它周围滑动一下时才会好。

您可以拥有自己的自定义移动阶段。将if (Input.GetTouch(i).phase == TouchPhase.Moved)替换为if (Input.GetTouch(i).deltaPosition.magnitude > validMoveMagnitude)

validMoveMagnitude定义为float validMoveMagnitude = 1.5f;

编辑3

如果仍未检测到小动作,您可以创建一个存储最后一个触摸位置的变量,然后将其与新触摸位置进行比较。

Vector3 lastPos;

void Update()
{
    //Check for Press
    for (int i = 0; i < Input.touchCount; i++)
    {
        if (Input.GetTouch(i).phase == TouchPhase.Began)
        {
            lastPos = Input.GetTouch(i).position;
            Vector2 fingerRay = Camera.main.ScreenToWorldPoint(Input.GetTouch(i).position);
            RaycastHit2D objectHit = Physics2D.Raycast(fingerRay, Vector2.zero);
            if (objectHit)
            {
                //We hit something
                if (objectHit.collider.name == "myGameObjectName")
                {
                    Debug.Log("Touched Finger on GameObject: " + objectHit.collider.name);
                }
            }
        }

        //Get current Pos
        Vector3 currentPos = Input.GetTouch(i).position;

        //Check if we moved
        if (currentPos != lastPos)
        {
            //Update Last Pos
            lastPos = currentPos;
            Debug.Log("Finger Moved!" + lastPos);

            Vector2 fingerRay = Camera.main.ScreenToWorldPoint(Input.GetTouch(i).position);
            RaycastHit2D objectHit = Physics2D.Raycast(fingerRay, Vector2.zero);
            if (objectHit)
            {
                //We hit something while moving the finger
                if (objectHit.collider.name == "myGameObjectName")
                {
                    Debug.Log("Moved Finger on GameObject: " + objectHit.collider.name);
                }
            }
        }

        //Check for release
        if (Input.GetTouch(i).phase == TouchPhase.Ended)
        {
            // Debug.Log("Released Finger!");
        }
    }
}

答案 1 :(得分:0)

使用box collider将此脚本附加到该游戏对象。 您可以使用鼠标指针检测输入也适用于Android的事件。刚尝试了一个带有半尺寸面板的基本画布,附在盒子对撞机2D上。

Tableresult <- read.table(header = TRUE, text = "A.1.x   A.1.y   B.1.x   B.1.y   C.1.x   C.1.y
7   0.00    7   0.00    7   0.00
8   0.02    8   0.02    8   0.02
9   0.04    9   0.04    9   0.04
10  0.06    10  0.06    10  0.06
.   .   .   .   .   .
145 0.33    139 0.16    117 0.63
146 0.22    140 0.15    118 0.61
147 0.11    141 0.13    119 0.58", na.strings = '.')