Raycasting, чтобы найти щелчок мышью на объекте в играх 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. (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); Происхождение вектора2 = новый вектор2(ray.origin.x,ray.origin.y); RaycastHit2D hit = Physics2D.Linecast(origin,-Vector2.up,1 ‹‹ LayerMask.NameToLayer(Supports)); Уничтожить (hit.collider.gameObject); Но теперь, когда даже когда я нажимаю на другие места, объект удаляется.. Я думаю, что проблема в том, что направление raycast -Vector2.up.. В каком направлении я должен его направить??   -  person Bimal Bose B S    schedule 14.12.2013
comment
на самом деле не часть того, что вы просили, но в этой строке: Destroy(GameObject.Find(hit.collider.gameObject.name)); найти не нужно. Простое выполнение Destroy(hit.collider.gameObject); должно работать нормально.   -  person Steven Mills    schedule 16.12.2013
comment
Я не могу использовать это условие из-за ошибки. Он сказал, что не может конвертировать из «UnityEngine.Ray в UnityEngine.vector2». То же, что Рэй Рэй.   -  person David Dimalanta    schedule 12.02.2014


Ответы (4)


Вы не можете использовать функции 3D-физики в новом 2D-материале. Вместо этого используйте 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 с помощью щелчка мыши в единстве 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-й случай. Если есть более 1 игрового объекта друг над другом, и вы пытаетесь понять, что нажат конкретный игровой объект:

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

Вы должны сначала прикрепить сетчатый коллайдер (любой коллайдер) к вашему объекту, чтобы войти во внутреннее «Если». Затем,

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