Raycasting เพื่อค้นหาการคลิกเมาส์บน Object ในเกม unity 2d

ฉันกำลังพยายามลบวัตถุที่คลิกเมาส์ ฉันกำลังสร้างเกม 2D โดยใช้ Unity3D 4.3 ใหม่ นี่คือรหัสที่ฉันใช้

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));

        }
    }

}

ตัวควบคุมไม่ได้เข้าสู่ if loop ภายใน (isHit ไม่ได้ถูกตั้งค่าเป็นเท็จ)


person Bimal Bose B S    schedule 14.12.2013    source แหล่งที่มา
comment
วัตถุมีชนกันหรือไม่? มันมีตัวชนและตัวแข็งหรือไม่?   -  person Happy Apple    schedule 14.12.2013
comment
ใช่ มันมีคอลไลเดอร์และวัตถุแข็งเกร็ง   -  person Bimal Bose B S    schedule 14.12.2013
comment
ฉันใช้ Physics2D และใช้งานได้!! นี่คือรหัสที่แก้ไข Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); Vector2 orgin = Vector2 ใหม่ (ray.origin.x,ray.origin.y); RaycastHit2D hit = Physics2D.Linecast(orgin,-Vector2.up,1 ‹‹ LayerMask.NameToLayer(รองรับ)); ทำลาย(hit.collider.gameObject); แต่ตอนนี้แม้ว่าฉันจะคลิกที่อื่นวัตถุก็ถูกลบไป .. ฉันคิดว่าปัญหาอยู่ที่ทิศทางของเรย์คาสต์ที่เป็น -Vector2.up .. ฉันควรโยนมันไปในทิศทางใด ??   -  person Bimal Bose B S    schedule 14.12.2013
comment
ไม่ใช่ส่วนหนึ่งของสิ่งที่คุณถามจริงๆ แต่ในบรรทัดนี้: Destroy(GameObject.Find(hit.collider.gameObject.name)); find ไม่จำเป็น เพียงแค่ทำ Destroy(hit.collider.gameObject); ก็ควรจะใช้ได้ดี   -  person Steven Mills    schedule 16.12.2013
comment
ฉันไม่สามารถใช้เงื่อนไขนั้นได้เนื่องจากมีข้อผิดพลาด มันบอกว่าไม่สามารถแปลงจาก 'UnityEngine.Ray เป็น UnityEngine.vector2' ได้ เช่นเดียวกับเรย์เรย์   -  person David Dimalanta    schedule 12.02.2014


คำตอบ (4)


คุณไม่สามารถใช้ฟังก์ชันฟิสิกส์ 3 มิติกับสิ่ง 2 มิติใหม่ได้ ใช้ ฟังก์ชัน 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);
}
person Esa    schedule 03.03.2014

คำถามนี้เก่าไปหน่อย แต่ฉันกำลังมองหาวิธีรับ GameObject ด้วยการคลิกเมาส์ใน unity 2D และคำตอบจาก Esa เกือบจะช่วยฉันได้แล้ว แต่ฉันไม่สามารถทำให้มันใช้งานได้ ดังนั้นด้วย การวิจัยเล็กน้อยฉันเห็นว่า Camera.main.ScreenToWorldPoint คืนศูนย์กลางของพื้นที่หน้าจอของกล้องและทำงานได้อย่างถูกต้อง จำเป็นต้องป้อนส่วนต่างในตำแหน่ง Z จากกล้องและ GameObject ที่ใกล้ที่สุด กล้องของฉันถูกตั้งค่าเริ่มต้นไว้ที่ -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);
}
person Wylht Heartless    schedule 07.01.2015

ขั้นแรกให้แนบคอลไลเดอร์ 2D ประเภทใดก็ได้เข้ากับ GameObject ของคุณ จากนั้นเลือกหนึ่งในวิธีแก้ปัญหาเหล่านั้น

กรณีที่ 1 - หากมี GameObject มากกว่า 1 รายการวางซ้อนกัน และคุณพยายามทำความเข้าใจว่า 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 ();
            }
        }
    }
}

กรณีที่ 2 - หากมีเพียง 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 ();
        }
    }
}
person Ahmet Hayrullahoglu    schedule 03.11.2016

คุณต้องแนบ mesh collider (ตัวชนใด ๆ ) กับวัตถุของคุณก่อนเพื่อเข้าสู่ภายใน If แล้ว,

Destroy(hit.collider.gameObject); 

ก็จะทำงาน

อาจจะมีงานอื่นแถวนี้

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);
        }
    }
}
person Reaz Murshed    schedule 18.02.2014