簡體   English   中英

Unity 2D觸摸代碼會銷毀所有對象?

[英]Unity 2D touch code destroying all objects?

在尋找可以在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

這里發生的是OverlapPoint返回該點重疊的對撞機,這意味着您正在檢查:如果滑動與任何對撞機重疊,則銷毀該游戲對象。

您要使用hit.collider2D,它將存儲重疊的collider2D。 盡管hit.collider始終為null,這是因為您沒有任何對撞機,而您只有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;
            }
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM