Unity 2D触摸码破坏所有物体

本文关键字:所有物 2D 触摸 Unity | 更新日期: 2023-09-27 18:20:55

在Unity中寻找处理触摸控制的解决方案后,我找到了一个似乎有效的解决方案。问题是,当检测到触摸时,每个带有2D对撞机的物体都会被破坏。我只想把被触摸过的东西销毁。

场景中的每个游戏对象都是预制的。它们都是8个不同的随机预制件的克隆体。这些预制件中的每一个都有一个圆形对撞机2D,以及名为TouchManager.cs 的触摸控制脚本

我曾尝试将"if(hit)"部分更改为"if(hit.collider!=null)",但由于某种原因,这导致它不起作用。我已经尝试了我能想到的一切,但都不起作用!有人能帮忙吗?

TouchManager.cs

// Update is called once per frame
void Update ()
{
    if (Input.touchCount > 0)
    {
        if (Input.GetTouch(0).phase == TouchPhase.Began)
        {
            Vector3 wp = Camera.main.ScreenToWorldPoint(Input.GetTouch(0).position);
            Vector2 touchPos = new Vector2(wp.x, wp.y);
            Collider2D hit = Physics2D.OverlapPoint(touchPos);
            if (hit)
            {
                touched = true;
                startPos = Input.GetTouch(0).position;
            }
        }   
        if (Input.GetTouch(0).phase == TouchPhase.Moved)
        {
        }
        if (Input.GetTouch(0).phase == TouchPhase.Ended)
        {
            if (touched == true)
            {
                float swipeDirection = Mathf.Sign(Input.GetTouch(0).position.y - startPos.y);
                if (swipeDirection > 0)
                {
                    Destroy(gameObject);
                }
                else if (swipeDirection < 0)
                {
                }
                // Reset touched
                touched = false;
            }
        }   //END SWITCH
    }   //END IF TOUCHED
}   //END UPDATE

Unity 2D触摸码破坏所有物体

这里发生的事情是OverlapPoint返回该点重叠的碰撞器,这意味着您正在检查:如果滑动与任何碰撞器重叠,则销毁此游戏对象。

你想要的是使用hit.collider2D,它将存储重叠的collider2D。虽然hit.collider总是为null,但这是因为你没有任何对撞机,你只有对撞机2D。

由于OverlapPoint针对所有碰撞器进行测试,而不关心它是从哪个游戏对象运行的,因此最好将它放置在单个管理器对象中,而不是每个对象中,然后让该管理器销毁其他对象。

此代码将只销毁一个对象。记得把它放在一个与你正在摧毁的物体分开的物体上。我怀疑它会给你一个想要的行为,但由于我不知道那是什么,我把它留给你练习。

Vector3 startPos;
GameObject hitObject;
void Update()
{
    if (Input.touchCount > 0)
    {
        if (Input.GetTouch(0).phase == TouchPhase.Began)
        {
            Vector3 wp = Camera.main.ScreenToWorldPoint(Input.GetTouch(0).position);
            Vector2 touchPos = new Vector2(wp.x, wp.y);
            Collider2D hit = Physics2D.OverlapPoint(touchPos);
            if (hit != null)
            {
                hitObject = hit.collider2D.gameObject;
                startPos = Input.GetTouch(0).position;
            }
        }
        if (Input.GetTouch(0).phase == TouchPhase.Ended)
        {
            if (hitObject != null)
            {
                float swipeDirection = Mathf.Sign(Input.GetTouch(0).position.y - startPos.y);
                if (swipeDirection > 0)
                {
                    Destroy(hitObject);
                }
                else if (swipeDirection < 0)
                {
                }
                hitObject = null;
            }
        }
    }
}