2017-03-02 3 views
0

타일 기반 게임이 있습니다. 타일을 어린이 대상으로 타워를 배치합니다. 나는 레이캐스팅으로 타워에서 마우스 클릭을 감지 할 수 있기를 원합니다. 타일과 타워에는 모두 2 차원 상자 충돌기가 있습니다. 타일에 대한 클릭을 감지 할 수는 있지만 레이크 캐스트는 타워에있는 클릭을 감지하지 못합니다. 이 문제를 어떻게 해결할 수 있습니까? 감사.Unity : Raycast가 하위 개체의 Collider에서 작동하지 않습니다.

if (Input.GetMouseButtonDown(0)) 
     { 
      Ray ray = camera.ScreenPointToRay(Input.mousePosition); 

      ray.origin = camera.transform.position; 

      RaycastHit2D hit = Physics2D.Raycast(camera.transform.position, -Vector2.up, 50, 8); 

      if (hit.collider != null && !EventSystem.current.IsPointerOverGameObject()) 
      { 
       Debug.Log(hit.collider.transform.tag); 
       //Transform objectHit = hit.transform; 

      } 
     } 
    } 

나는 타일 마스크 (여기 층 (8)) 나는 아무것도 얻을 :

여기 raycasting 내 코드입니다. 타일 ​​(타일과 같은)에도 2d 상자 콜라이더가 있지만 광선이 결코 타워에 부딪치지 않는 것 같습니다.

+1

문제가있는 충돌기 속성의 스크린 샷을 표시 할 수 있습니까? 레이캐스터가 전혀 타격을가합니까? 자세한 내용은 문제를 해결할 수있는 상태로 좁히는 데 도움이됩니다. – Serlite

+0

타일의 충돌자를 확인하고 타일에 자식이 있는지 찾아서 제어 할 수 있습니다. [https://docs.unity3d.com/ScriptReference/Transform.GetChild.html](https://docs.unity3d.com/ ScriptReference/Transform.GetChild.html) –

+0

실제 질문을하십시오. 가능한 한 좋은 이슈를 설명하려고 시도하십시오. –

답변

1

을하는 데 도움이

희망이 객체의 모든 자식 colliders가 상위에 속하는 것으로 간주됩니다 것으로 보인다. 이것은 작은 것들로 더 복잡한 충돌자를 만들 수 있기 때문에이 상황이 일반적으로 필요합니다. 정확한 입자 가속기는 여전히 예를 들어,이 속성을 변환있어 사용하여 참조 할 수 있습니다 차일에

if (hit.collider.transform != null) 
{ 
    //Execute code 
} 

이 참조 할 구체적 입자 가속기.

+0

이것은 완벽하게 작동합니다. 한가지 더 질문합니다. 마우스를 마우스 위치로 캐스팅 할 때 마우스가 게임 뷰 외부에있을 때 null 참조 오류가 발생합니다. * if (hit.collider.transform! = null) * 행에 있습니다. 실제로 이것이 null인지 확인하는 동안 왜 이런 일이 발생합니까? –

+0

아,이 기능은 꼭 필요한 것은 아닌 객체의 속성을 검사합니다. 먼저 객체가 null인지 확인한 다음 객체의 속성이 null인지 확인합니다 (hit.collider를 확인한 다음 hit.collider.transform을 확인하십시오). 계층 구조에서 가장 높은 것이 먼저 점검되는 한 동일한 if 문에서이 작업을 수행 할 수 있습니다. –

+0

나는 그것이 의미가 있기를 바랍니다. 그러나 그렇지 않다면 그것을 바꿀 것입니다. –

1

유니티는 레이어 시스템을 사용하며 레이 캐스트가 사용중인 레이어를 필터링 할 수 있습니다. 이것을 사용하여 특정 충돌자를 공격하고 타일/타워 문제와 같은 다른 것들을 피할 수 있습니다. (2D 버전) 구문은 다음과 같습니다

RaycastHit2D Raycast(Vector2 origin, Vector2 direction, float distance 
= Mathf.Infinity, int layerMask = DefaultRaycastLayers, float minDepth 
= -Mathf.Infinity, float maxDepth = Mathf.Infinity); 

당신이 layermask 매개 변수는 부모 객체가있는 것과 다른 레이어를 선택 볼 수 있습니다. 그런 다음 아래 표시된 것처럼 관리자의 드롭 다운 메뉴를 사용하여 다른 레이어에 어린이를 배치합니다.

enter image description here

당신은 부모의 레이어를 설정하고 아이는 별도로 게임 오브젝트. 약간의 연구 후

+0

이렇게하면 해결되지만 커뮤니티에서 특정 문제를 해결하는 데 도움이 될 수 있지만 코드를 게시 할 수는 있습니다. –

+0

감사합니다. 내가 너무 피곤하기 전에 코드를 제공하지 않아서 유감스럽게도 질문을 편집했습니다. 것은, 나는 타일을 차일드로 배치하지만, 광선은 결코 타워에 부딪치지 않는다. 나는 타일을 가려서 아무것도 얻지 못한다. –

+0

지금 확인해 주시겠습니까? @ Mr.Bigglesworth –

관련 문제