2013-12-14 6 views
10

Я пытаюсь удалить объект, на который нажата мышь. Я делаю 2D-игру, используя новый Unity3D 4.3. Вот код, который я используюRaycasting, чтобы найти mouseclick на Object in unity 2d games

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 не устанавливается как ложное).

+1

У объекта есть коллайдер? У него есть коллайдер и жесткий? –

+0

Да, он содержит коллайдер и жесткое тело –

+3

Я использовал Physics2D, и он работает! Это модифицированный код Ray ray = Camera.main.ScreenPointToRay (Input.mousePosition); Vector2 orgin = new Vector2 (ray.origin.x, ray.origin.y); RaycastHit2D hit = Physics2D.Linecast (orgin, -Vector2.up, 1 << LayerMask.NameToLayer («Поддерживает»)); Уничтожить (hit.collider.gameObject); Но теперь, когда даже тогда, когда я нажимаю на других местах объект будет удален .. Я думаю, что проблема с направлением raycast быть -Vector2.up .. В каком направлении я должен бросить его ?? –

ответ

1

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

Вы не можете использовать функции 3D-физики для нового 2D-материала. Вместо этого используйте 2D functions. Пример:

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

if(hit.collider != null) 
{ 
    Debug.Log ("Target Position: " + hit.collider.gameObject.transform.position); 
} 
6

Этот вопрос немного старый, но я искал аа способа получить 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); 
} 
1

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

первый случай - Если есть больше чем 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-й случай - I f есть только 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(); 
     } 
    } 
} 
Смежные вопросы