2017-11-18 7 views
1

플레이어를 원점으로 가지는 범위 내에서 물체를 감지하려고합니다. 콜리어를 사용하지 않고 플레이어 주위의 특정 영역에서 Transforms을 어떻게 찾을 수 있습니까? 내가 필요한 유일한 정보는 지정된 LayerMask에서 가까운 객체의 변형입니다. 더 자세하게는이 위치를 사용하지 마십시오. 회전) 물리학을 사용한다면 불필요한 모든 지점에 방아쇠를 당겨야 할 것입니다.피직스/레이 캐스트가없는 근처의 GameObject를 어떻게 찾을 수 있습니까?

물리학을 사용하는 것과 비슷한 다른 근사 점을 찾는 다른 방법이 있습니까?

+0

당신이 당신의 게임 우주의 주인이다. 당신은 그들 모두를 얻을 수 있어야합니다. 플레이어와 원하는 물체까지의 거리를 계산하면 설정됩니다. 이는 무차별 적입니다. 원하는 업데이트에 스크립트를 첨부하고 플레이어와의 거리를 계산하도록 할 수 있습니다. 임계점 아래에있는 경우 "플레이어의 영향 범위 안에 있음"이라고 일부 주인 객체에게 알립니다. - 부기 관리자는 내부 목록을 확인합니다. 이 구체에서 빠져 나온 것들을 업데이트하고 제거합니다. 그것에 대해 생각하고 코드화하십시오. –

+0

Vector3.Distance를 사용하면 많은 포인트가 비싸지 않습니까? – Noobie

+1

당신은 플레이어 주위에 레이 캐스트를 던져서 그들이 xyz 거리에 있는지 확인할 수 있습니다. aproach를 결정하고 문제가 발생하면 코드를 보여주십시오. –

답변

1

Physcics 또는 Colliders없이이 작업을 수행하려면 모든 개체에 액세스하십시오. 루프를 반복하고 레이어를 확인한 다음 일치하는 경우 Vector3.Distance을 사용하여 각 객체의 거리를 비교합니다. 결과를 리턴하십시오.

List<GameObject> findNearObjects(GameObject targetObj, LayerMask layerMask, float distanceToSearch) 
{ 
    //Get all the Object 
    GameObject[] sceneObjects = UnityEngine.Object.FindObjectsOfType<GameObject>(); 

    List<GameObject> result = new List<GameObject>(); 

    for (int i = 0; i < sceneObjects.Length; i++) 
    { 
     //Check if it is this Layer 
     if (sceneObjects[i].layer == layerMask.value) 
     { 
      //Check distance 
      if (Vector3.Distance(sceneObjects[i].transform.position, targetObj.transform.position) < distanceToSearch) 
      { 
       result.Add(sceneObjects[i]); 
      } 
     } 
    } 
    return result; 
} 

모든 GameObjects를 검색 할 Scene.GetRootGameObjects를 사용하여 개선 될 수 있지만 DontDestroyOnLoad으로 표시된 개체를 반환하지 않습니다. 확장 기능과 확장

:

public static class ExtensionMethod 
{ 
    public static List<GameObject> findNearObjects(this GameObject targetObj, LayerMask layerMask, float distanceToSearch) 
    { 
     GameObject[] sceneObjects = UnityEngine.Object.FindObjectsOfType<GameObject>(); 
     List<GameObject> result = new List<GameObject>(); 
     for (int i = 0; i < sceneObjects.Length; i++) 
      if (sceneObjects[i].layer == layerMask.value) 
       if (Vector3.Distance(sceneObjects[i].transform.position, targetObj.transform.position) < distanceToSearch) 
        result.Add(sceneObjects[i]); 
     return result; 
    } 
} 

사용법 :

List<GameObject> sceneObjects = gameObject.findNearObjects(layerMask, 5f);