2017-10-25 13 views
0

메쉬에 임의로 소품을 놓으려고합니다. 메쉬는 2 개의 재질로 구성되어 있으며 재료 중 하나에 소품 만 놓고 싶습니다. 저는 현재 광선 수신을 통해이 작업을하고 있습니다. 포인트 히트에서 소재를 결정하고 소재가 정확하면 그 지점에서 소품을 배치합니다. 자료가 잘못 판별되고 있으며 그 이유가 확실하지 않은 문제가 있습니다. 코드는 다음과 같습니다. UnityEngine을 사용하는 ;Unity3d에서 레이캐스팅을 통한 서브 메쉬 결정

public class BoundingBoxTry : MonoBehaviour { 

// Use this for initialization 
public MeshFilter meshFilter; 
private Renderer rend; 
private Mesh mesh; 
private Bounds bnds; 
private float nextX, nextZ, maxX, minX, maxZ, minZ; 
public GameObject rayOrigin; 
public GameObject propPreFab; 
private MeshCollider thisCollider; 
void Start() { 
    thisCollider = GetComponentInChildren<MeshCollider>(); 
    rend = GetComponentInChildren<Renderer>(); 
    mesh = GetComponentInChildren<MeshFilter>().sharedMesh; 
    bnds = rend.bounds; 
} 

void Update() { 
    nextX = Random.Range(0, bnds.size.x); 
    nextZ = Random.Range(0, bnds.size.z); 
    nextX = nextX-bnds.size.x/2; 
    nextZ = nextZ-bnds.size.z/2; 
    nextX = bnds.center.x-nextX; 
    nextZ = bnds.center.z-nextZ; 
    RaycastHit hit = new RaycastHit(); 
    Vector3 randomCoord = new Vector3(nextX, 0, nextZ); 
    rayOrigin.transform.position = new Vector3(nextX, 100, nextZ); 
    bool didHit = Physics.Raycast(rayOrigin.transform.position, -new Vector3(0, 1, 0), out hit); 
    int vertCounter = 0; 

    if(didHit && hit.collider == thisCollider){ 
     for (int sMC = 0; sMC < mesh.subMeshCount; sMC++) 
     { 
      int[] subMesh = mesh.GetTriangles(sMC); 
      vertCounter = vertCounter + subMesh.Length;    
      if(hit.triangleIndex < vertCounter){ 
       if(rend.sharedMaterials[sMC] == rayOrigin.GetComponent<Renderer>().sharedMaterial){ 
        GameObject prop = Instantiate(propPreFab, hit.point, Quaternion.identity); 
       } 
       else{ 
       } 
      } 
     } 
    } 
} 
} 

나는 또한 내가 보는 행동을 보여주기위한 그림을 첨부했습니다. Behavior

+0

이 대답의 코드 예를 참조하십시오. http://answers.unity3d.com/questions/291853/raycasthit-triangleindex-and-submeshes-which-subme.html –

답변

0

물론 문제를 묻고 잠자 마자 알아낼 수 있습니다. Arman의 링크도 도움이되었습니다. 내가보고 있던 문제는 triangleIndex 호출에서 얻은 데이터를 완전히 이해하지 못하기 때문에 발생했습니다. triangleIndex를 호출하면 정점 인덱스가 다시 나타납니다. 해당 버텍스에서 삼각형 히트를 얻으려면 버텍스 인덱스에 3을 곱한 다음 레이 캐스트가 적용된 subMesh를 확인해야합니다.