메쉬에 임의로 소품을 놓으려고합니다. 메쉬는 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{
}
}
}
}
}
}
나는 또한 내가 보는 행동을 보여주기위한 그림을 첨부했습니다.
이 대답의 코드 예를 참조하십시오. http://answers.unity3d.com/questions/291853/raycasthit-triangleindex-and-submeshes-which-subme.html –