Unity Input.Touches 如果按住 touch 则不执行任何操作

本文关键字:执行 任何 操作 touch Input Touches 如果 Unity | 更新日期: 2023-09-27 17:57:23

新手...学习Unity制作手机游戏,我有一个小的六角网格地图,当触摸瓷砖时会变成随机颜色。我有一个脚本,让相机用手指按压来移动它,用两根手指放大一个。

我希望磁贴只在单次触摸时更改颜色,而不会在平移或缩放相机时更改。我已经尝试了两天,用谷歌搜索了自己,似乎无法弄清楚。这似乎很简单。

下面是当光线投射击中对象时从 Update() 调用的代码。这只会改变十六进制的颜色,但我希望它只在不平移或缩放相机时执行此操作。

void Touch_Hex(GameObject ourHitObject)
{
    Touch[] touches = Input.touches;
    if (touches[0].phase == TouchPhase.Ended)
    {
        MeshRenderer mr = ourHitObject.GetComponentInChildren<MeshRenderer>();
        mr.material.color = color[Random.Range(0, color.Length)];
    }
}

我已经尝试了所有不同的阶段组合等,但无法让它按照我想要的方式工作。我认为deltaTime或deltaPostion是答案,但我无法解决。

干杯

Unity Input.Touches 如果按住 touch 则不执行任何操作

您需要使用 boolean 变量和 touches[0].phase == TouchPhase.Moved 的组合。当touches[0].phase == TouchPhase.Moved true时,您的输入现在被视为无效。然后,您可以将变量设置为 boolean truefalse 稍后使用它来决定是否更改颜色。

bool onlyTouched;
void Update()
{
    if (Input.touchCount > 0)
    {
        Ray ray = Camera.main.ScreenPointToRay(Input.GetTouch(0).position);
        RaycastHit hit;
        if (Input.GetTouch(0).phase == TouchPhase.Began)
        {
            //Touched
            onlyTouched = true;
        }

        if (Input.GetTouch(0).phase == TouchPhase.Moved)
        {
            //Moved Finger (Now Invalid!)
            onlyTouched = false;
        }
        if (Input.GetTouch(0).phase == TouchPhase.Ended)
        {
            //Check if only touched then change color
            if (onlyTouched)
            {
                Debug.Log("Only touched Finger");
                //MeshRenderer mr = ourHitObject.GetComponentInChildren<MeshRenderer>();
                //mr.material.color = color[Random.Range(0, color.Length)];
                if (Physics.Raycast(ray, out hit))
                {
                    if (hit.transform != null)
                    {
                        MeshRenderer mr = hit.transform.gameObject.GetComponentInChildren<MeshRenderer>();
                        mr.material.color = color[Random.Range(0, color.Length)];

                        //hit.transform.GetComponent<MeshRenderer>().material.color = Color.red;
                    }
                }
            }
            else
            {
                Debug.Log("Finger was moved while touching");
            }
            //Reset onlyTouched for next read
            onlyTouched = false;
        }
    }
}