当我在Unity 2D中触摸其中一个时,两个不同的Raycast 2D同时命中

问题描述 投票:0回答:2

我创建了一个光线投射2D以在点击时销毁第一个游戏对象,并创建第二个光线投射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);
             }
         }

     }
unity3d onclick 2d raycasting
2个回答
0
投票

if (mouse is down) { check that the object I'm interested in exists, then destroy it }

您的代码没有检查光线是否真正击中了对象!或者,就此而言,甚至进行射线投射以查看是否准备好了他的任何东西。

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物理,则需要分别使用RaycastHit2DPhysics2D。 2D和3D物理引擎不以任何方式进行通信。


0
投票

感谢@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);
            }
        }
    }
© www.soinside.com 2019 - 2024. All rights reserved.