Raycasting, чтобы найти mouseclick на Object в единстве 2d игры - программирование

Raycasting, чтобы найти mouseclick на Object в единстве 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 не устанавливается как false).

4b9b3361

Ответ 1

Вы не можете использовать трехмерные физические функции на новом 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);
}

Ответ 2

Этот вопрос немного стар, но я искал способ получить GameObject с щелчком мыши в единстве 2D, и ответ от Esa почти помог мне, но я не мог позволить ему работать, поэтому с небольшим количеством исследований я увидел, что Camera.main.ScreenToWorldPoint возвращал центр области экрана камеры, и он работает правильно. он должен был ввести разницу в позиции Z с камеры и ближайшего GameObject. Моя камера была установлена ​​по умолчанию в -10, а мой GameObject был в 0, поэтому мне нужно было установить мой Input.mousePosition.z на 10. Так что если у вас возникла проблема с кодом Esa (например, me:() приведенный ниже код может помочь вам:

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

Ответ 3

Сначала вы должны привязать кошелек сетки (любой коллайдер) к вашему объекту, чтобы ввести внутреннее значение 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);
        }
    }
}

Ответ 4

Сначала присоедините любой тип 2D-коллайдера к вашему GameObject, затем выберите одно из этих решений;

1-й случай. Если над Game-объектом находится более 1 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 ();
            }
        }
    }
}

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