Два разных Raycast 2D бьют одновременно, когда я касаюсь одного из них в Unity 2D - PullRequest
0 голосов
/ 22 апреля 2019

Я создаю один Raycast 2D для уничтожения первого игрового объекта на клике и создаю второй Raycast 2D для уничтожения второго игрового объекта на клике.

Когда я нажимаю на первый игровой объект, оба игровых объекта уничтожаются одновременно, почему это происходит и как я могу уничтожить только объект, к которому я прикоснулся?

// First gameObject Script
using UnityEngine.EventSystems;

RaycastHit2D hit1Up = Physics2D.CircleCast(transform.position, 0.5f, Vector2.up * 0.35f);
RaycastHit2D hit1Bottom = Physics2D.CircleCast(transform.position, 0.5f, Vector2.down * 0.77f);
Debug.DrawRay(transform.position, Vector3.up * 0.35f, Color.green);
Debug.DrawRay(transform.position, Vector3.down * 0.77f, Color.green);

Ray firstRay = Camera.main.ScreenPointToRay(Input.mousePosition);

     if (Input.GetMouseButtonDown(0) && !EventSystem.current.IsPointerOverGameObject())
     {

         if (hit1Up.collider != null || hit1Bottom.collider != null)
         {
             if (hit1Up.collider.tag == "TagName1" || hit1Bottom.collider.tag == "TagName1")
             {
                 Debug.Log("You touched TagName1");
                 destroy(this.gameObject);
             }
         }

     }


// Second gameObject Script
using UnityEngine.EventSystems;

RaycastHit2D hit2Up = Physics2D.CircleCast(transform.position, 0.5f, Vector2.up * 0.35f);
RaycastHit2D hit2Bottom = Physics2D.CircleCast(transform.position, 0.5f, Vector2.down * 0.77f);
Debug.DrawRay(transform.position, Vector3.up * 0.35f, Color.yellow);
Debug.DrawRay(transform.position, Vector3.down * 0.77f, Color.yellow);

Ray secondRay = Camera.main.ScreenPointToRay(Input.mousePosition);

     if (Input.GetMouseButtonDown(0) && !EventSystem.current.IsPointerOverGameObject())
     {

         if (hit2Up.collider != null || hit2Bottom.collider != null)
         {
             if (hit2Up.collider.tag == "TagName2" || hit2Bottom.collider.tag == "TagName2")
             {
                 Debug.Log("You touched TagName2");
                 destroy(this.gameObject);
             }
         }

     }

Ответы [ 2 ]

0 голосов
/ 23 апреля 2019

Спасибо @ Draco18s за ваш ответ, он помог мне придумать логику 2D-версии, в которой я нуждался в некоторых исследованиях.Ура!

string tagName1, tagName2;

if (Input.GetMouseButtonDown(0))
    {
        Vector2 worldPoint = Camera.main.ScreenToWorldPoint(Input.mousePosition);
        RaycastHit2D hit = Physics2D.Raycast(worldPoint, Vector2.zero);

        if (hit.collider != null)
        {
            //Debug.Log(hit.collider.name);
            if (hit.collider.CompareTag(tagName1))
            {
                print(tagName1);
                Destroy(hit.collider.gameObject);
            } else if (hit.collider.CompareTag(tagName2))
            {
                print(tagName2);
                Destroy(hit.collider.gameObject);
            }
        }
    }
0 голосов
/ 22 апреля 2019

if (мышь не работает) {проверить, что интересующий меня объект существует, затем уничтожить его}

Ваш код не проверяет, что луч действительно попал в объект! Или, в этом отношении, даже выполняя приведение луча, чтобы увидеть, готов ли его что-нибудь вообще.

if (hit2Up.collider != null || hit2Bottom.collider != null)

Черт возьми, я должен надеяться, что это правда, прежде чем твой код когда-либо запускается. Эта проверка бесполезна.

if (hit2Up.collider.tag == "TagName2" || hit2Bottom.collider.tag == "TagName2")

Полагаю, это будет либо всегда верно, либо всегда ложно. Учитывая, что ваш код уничтожает объект, я подозреваю, что это правда. Эта проверка бесполезна.

Что вы должны сделать:

  1. Вызовите Physics.raycast, используя параметр out RaycastHit (это будет заключено в оператор if, если вы ничего не нажали, нет необходимости выполнять какие-либо дополнительные проверки)
  2. Убедитесь, что hit.collider == hitUp.collider

Вам также не нужны два скрипта для этого, достаточно того же, который использовался дважды с разными значениями.

Пример реализации:

string tagName;

Update() {
    Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
    RaycastHit hit;
    if(Physics.Raycast(ray, out hit)) {
        if(hit.collider.CompareTag(tagName)) {
            Debug.Log("You touched " + tagName);
            destroy(hit.collider.gameObject);
        }
    }
}

Примечание: если вы используете физику 2D, вам нужно использовать RaycastHit2D и Physics2D соответственно. 2D и 3D физические движки никак не взаимодействуют.

...