2017-10-25 18 views
0

私はランダムにメッシュに小道具を置こうとしています。メッシュには2つの素材があり、そのうちの1つにのみ小道具を配置したいと思います。私は現在、レイキャスティングでこれをやっています。ポイントヒットで素材を決定し、素材が正しい場合はそのポイントで小道具を配置します。私は材料が間違って決定されている問題を抱えています。なぜ私はその理由がわかりません。コードは以下のとおりです。 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

もちろん、問題を尋ねて寝るとすぐに、私はそれを理解することができます。アルマンのリンクも役立ちました。私が見ていた問題は、私がtriangleIndex呼び出しから得たデータを完全に理解していないことが原因でした。 triangleIndexを呼び出すと、頂点インデックスが返されます。その頂点から三角ヒットを得るには、頂点インデックスに3を掛けて、どのサブメッシュがレイキャストに当たったのかを検証する必要があります。