2017-01-25 5 views
3

이벤트 메시지를 보내어 플레이어가 내부에 있는지 여부를 감지하는 충돌 영역이있는 안전 영역이 있습니다. 그러나 안전 지대 안에는 많은 다른 물건들이 있습니다. 안전 영역 내부의 다른 개체에 대한충돌 감지 중 플레이어와 다른 객체 콜리 더 구분하기

void Start() 
{ 
    if (player == null) 
    { 
     player = GameObject.Find("Gringan").GetComponent<Player>(); 
     Debug.Log("player = " + player.name); 
    } 
} 

void OnTriggerEnter(Collider other) 
{ 
    //else ... 
    if (other.transform.parent.GetComponent<Player>() == player) 
    { 
     print("Collision detected with trigger object " + player.name); 
     safe = true; 
     m_Player.PlayerIsSafe.Send(safe); 
    } 
} 

, 내가 null 참조 예외를 얻을 :

내 플레이어가 내부 경우, 내가 사용하는 감지합니다. (다른 객체에는 .parent이 필요하지 않으며 Player 구성 요소가 없습니다 ...)

오류 메시지가 표시되지 않고 이러한 항목을 감지하여이를 피하고 싶습니다. "// else"앞에 뭔가를 써서 다음 플레이어 (if)에만 내 플레이어를 추가하고 싶습니다. 태그와 여러 가지 방법으로 시도했지만 작동시키지 못했습니다.

답변

3

일반적인 해결책은 태그를 사용하여 개체를 식별하는 것이므로 GetComponent()을 시도하기 전에 그 개체가 무엇인지 알 수 있습니다. 이렇게하면 처리 시간이 절약되고 존재하지 않는 구성 요소를 사용하려고 할 때 발생할 수있는 오류를 피할 수 있습니다. 당신이 태그 "플레이어"와 플레이어 오브젝트 계층 구조의 최상위 게임 오브젝트 태그를 경우

예를 들어, 당신은 쓸 수 :

void OnTriggerEnter(Collider other) 
{ 
    //else ... 
    if (other.transform.root.CompareTag("Player") 
     && other.transform.parent.GetComponent<Player>() == player) 
    { 
     print("Collision detected with trigger object " + player.name); 
     safe = true; 
     m_Player.PlayerIsSafe.Send(safe); 
    } 
} 

참고 : 덕분에 단락 C#에서 조건 연산자와 함께 비교를 위해 여러 개의 중첩 문을 작성할 필요가 없습니다. CompareTag()이 실패하면 후속 GetComponent()이 실행되지 않습니다.

희망이 도움이됩니다. 궁금한 점이 있으면 알려주세요.

+0

답장을 보내 주셔서 감사합니다. tryed하지만 오류가 있습니다 : 안전 영역에있는 다른 객체는 허용하지 않습니다 : ".parent"하지만 내 플레이어를 탐지해야합니다. NullReferenceException : 개체 참조가 개체의 인스턴스로 설정되지 않았습니다. SafeZone.OnTriggerEnter (UnityEngine.Collider other) (Assets/My Assets/Scripts/SafeZone.cs : 60) –

+0

@mad_mask 흠 플레이어 오브젝트의 장면 계층을 질문에 추가 하시겠습니까? 그것은 당신이 일을 어떻게 설정했는지에 대한 더 명확한 그림을 줄 것입니다. (대개, 당신이 당신의 충돌자를 같은 레벨이 아닌'Player' 구성 요소 밑에 놓은 이유가 궁금합니다.) – Serlite

+0

@mad_mask 가정에 기초하여 내 대답을 편집했습니다. – Serlite