【问题标题】:Unity 2D touch code destroying all objects?Unity 2D 触摸代码破坏所有对象?
【发布时间】:2014-09-06 03:21:05
【问题描述】:

在 Unity 中寻找处理触摸控制的解决方案后,我发现了一个似乎可行的解决方案。问题是,当检测到触摸时,每个带有 2D 碰撞器的对象都会被破坏。我只希望被触摸的对象被销毁。

场景中的每个游戏对象都是一个预制件。它们都是 8 种不同的随机预制件的克隆。这些预制件中的每一个都有一个 Circle Collider 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

【问题讨论】:

    标签: c# android unity3d touch


    【解决方案1】:

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

    你想要的是使用hit.collider2D,它将存储重叠的collider2D。 虽然 hit.collider 总是为空,那是因为你没有任何 colliders,你只有 collider2D。

    由于 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;
                }
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-31
      • 1970-01-01
      • 2021-02-18
      • 2015-02-06
      • 2015-02-14
      • 2020-08-19
      相关资源
      最近更新 更多