2016-12-02 25 views
1

개발 용으로 사용하는 Mixamo 모델이 있습니다. 이 모델은 해골로 완전히 조작됩니다. 나는 콜라이더가없는 상태에서 골격 조각을 선택할 수있는 함수를 만들려고합니다. 이 현재 스크립트 만 입자 가속기 작동Unity3d 클릭 할 가장 가까운 객체 선택 콜리 더 없음

,

public void RegisterSelectControls() 
{ 
    if (Input.GetMouseButtonDown(0)) 
    { 
     var hit = new RaycastHit(); 
     var ray = Camera.main.ScreenPointToRay(Input.mousePosition); 

     if (Physics.Raycast(ray, out hit, 100.0f)) 
     { 
      var objectHitName = hit.collider.transform.name; 
      Debug.Log(objectHitName); 
     } 
    } 
} 

클릭했다거나 클릭으로 골격의 가장 가까운 부분 골격의 일부 감지하는 방법이 있나요

?

모든 신체 부위에 Colliders를 수동으로 추가하고 싶지는 않습니다. 너무 과도하고 중복 될 수 있습니다. 다른 모델을 사용하기로 선택하면 상자 충돌기를 수정해야하므로이 작업을 수행하고 싶습니다. 상자 입자 가속기를 지정

편집 나는 미래에 내가 자연의 일부를 선택 할 수 있어야하는 모델을 업로드하는 사용자 수 있도록 지원하고자, 모델에 colliders를 추가 할 수 없습니다

척추의 구성 요소에 대한 사용자 설정 굵기없이 상호 작용하는 척추

+0

신체 부위가 다른 충돌기. http://answers.unity3d.com/questions/64678/head-shot-instant-kill-for-fps-enemies.html –

+0

"단합 헤드 샷"을 검색하십시오. –

+0

그래, 나는 이것이 충돌기와 함께 작동한다는 것을 알고 있지만 너무 많은 뼈가 있고 나는 그들 모두를 위해 수동으로 colliders를 추가하는 것 같이 느끼지 않는다. 나는 이것을 2 차원 평면에 클릭을 등록하고 거기에 가장 가까운 뼈를 찾는 것으로 계산하려고한다. –

답변

2

이 작업을 수행하는 방법을 찾는 다른 사용자에게는 실제로는 간단합니다. 이 함수를 업데이트 루프에 던지고 'SpineRoot'를 검사 할 모든 객체의 루트 노드와 같게 만듭니다.

public void RegisterSelectControls() 
{ 
    if (Input.GetMouseButtonDown(0)) 
    { 
     var clickLocation = Input.mousePosition; 

     Transform closestBone = null; 

     this.MinimumRecursiveBoneDistance(clickLocation, SpineRoot, out closestBone); 

     if(null != closestBone) 
     { 
      Debug.Log(closestBone.gameObject.name); 
     } 
    } 
} 

public float MinimumRecursiveBoneDistance(Vector3 clickLocation, Transform root, out Transform closestBone) 
{ 
    float minimumDistance = float.MaxValue; 
    closestBone = null; 
    foreach (Transform bone in root) 
    { 

     var boneScreenPoint = Camera.main.WorldToScreenPoint(bone.position); 
     var distance = Math.Abs(Vector3.Distance(clickLocation, boneScreenPoint)); 

     if (distance < minimumDistance) 
     { 
      minimumDistance = distance; 
      closestBone = bone; 
     } 

     if (bone.childCount > 0) 
     { 
      Transform closestChildBone; 
      var minimumChildDistance = this.MinimumRecursiveBoneDistance(clickLocation, bone, out closestChildBone); 
      if(minimumChildDistance < minimumDistance) 
      { 
       minimumDistance = minimumChildDistance; 
       closestBone = closestChildBone; 
      } 
     } 

    } 

    return minimumDistance; 
} 

이 코드는 일부 리팩터링을 사용할 수 있습니다. 이는 개념의 증거 일뿐입니다. 이것은 가장 가까운 순전히 작동합니다. 그러나 이것은 잠재적 인 버그를 야기 할 수 있습니다. 객체에 대한 클릭과 그 객체의 중심이 다른 객체의 가운데에있는 클릭에서 멀리 떨어지면 다른 객체를 선택하게됩니다.