Raycasting在Unity 2d游戏中找到对象的鼠标点击

Bim*_*B S 10 unity-game-engine unityscript

我试图删除单击鼠标的对象.我正在使用新的Unity3D 4.3进行2D游戏.这是我正在使用的代码

void Update () {

    if (Input.GetMouseButtonDown(0)) 
    {
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        RaycastHit hit;
        if(Physics.Raycast(ray,out hit))
        {
            isHit = false;
            Destroy(GameObject.Find(hit.collider.gameObject.name));

        }
    }

}
Run Code Online (Sandbox Code Playgroud)

控件未进入内部if循环.(isHit未被设置为false).

Esa*_*Esa 19

你不能在新的2D东西上使用3D物理函数.请改用2D功能.例:

RaycastHit2D hit = Physics2D.Raycast(Camera.main.ScreenToWorldPoint(Input.mousePosition), Vector2.zero);

if(hit.collider != null)
{
    Debug.Log ("Target Position: " + hit.collider.gameObject.transform.position);
}
Run Code Online (Sandbox Code Playgroud)


小智 6

这个问题有点陈旧,但我正在寻找一种方法来获得一个游戏对象,用鼠标点击统一2D,而Esa的回答几乎帮助了我,但是我没有能力让它工作,所以用一个一点研究我看到Camera.main.ScreenToWorldPoint正在返回相机屏幕区域的中心并且工作正常.它需要从相机和最近的GameObject输入Z位置的差异.我的相机默认设置为-10,我的GameObject为0,所以我需要做的就是将我的Input.mousePosition.z设置为10.所以如果你遇到问题与Esa的代码一起使用(比如我:()以下代码可以帮助您:

RaycastHit2D hit = Physics2D.Raycast(Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, 10)), Vector2.zero);

if(hit.collider != null)
{
    Debug.Log ("Target Position: " + hit.collider.gameObject.transform.position);
}
Run Code Online (Sandbox Code Playgroud)


Ahm*_*glu 5

首先将任何类型的2D对撞机附加到您的GameObject,然后选择其中一种解决方案;

第一种情况-如果彼此之间有多个GameObject,并且您尝试了解单击了特定GameObject,则:

void Update ()
{
    if (Input.GetMouseButtonDown (0)) {
        Ray ray = Camera.main.ScreenPointToRay (Input.mousePosition);
        RaycastHit2D[] hits = Physics2D.GetRayIntersectionAll (ray, Mathf.Infinity);
        foreach (var hit in hits) {
            if (hit.collider.name == name) {
                MyFunction ();
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

第二种情况-如果只有1个GameObject,并且您尝试了解是否单击了它:

void Update ()
{
    if (Input.GetMouseButtonDown (0)) {
        Ray ray = Camera.main.ScreenPointToRay (Input.mousePosition);
        RaycastHit2D hit = Physics2D.GetRayIntersection (ray, Mathf.Infinity);
        if (hit.collider != null && hit.collider.name == name) {
            MyFunction ();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


Rea*_*hed 2

您必须首先将网格碰撞器(任何碰撞器)与您的对象连接起来才能进入内部 If。然后,

Destroy(hit.collider.gameObject); 
Run Code Online (Sandbox Code Playgroud)

会简单地完成工作。

这里可能还有其他工作。

void Update () {

    Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
    RaycastHit hit;

    if(Physics.Raycast(ray,out hit))
    {
        if(Input.GetMouseButtonDown(0))
        {
            isHit = false;
            Destroy(hit.collider.gameObject);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)