private void SpawnRock(RockPrefabIndex rock, Vector3 position) { Vector3 eulerAngleRandomized = new Vector3(Random.Range(0, 360), Random.Range(0, 360), Random.Range(0, 360)); var gameObjectRock = (GameObject)PrefabUtility.InstantiatePrefab(rock.prefabRock as GameObject); gameObjectRock.transform.position = position; gameObjectRock.transform.eulerAngles = eulerAngleRandomized; if (rockGen.prefabContainer != null) { gameObjectRock.transform.SetParent(rockGen.prefabContainer); } Material selectedMaterial = rock.materialPalletes[Random.Range(0, rock.materialPalletes.Length - 1)]; MeshRenderer[] allRenderers = gameObjectRock.GetComponentsInChildren <MeshRenderer>(); foreach (MeshRenderer meshRenderer in allRenderers) { meshRenderer.material = selectedMaterial; } }
public void BuildRocks() { if (rockGen.allRockPrefabs.Count == 0) { Debug.Log("Rock Prefab Index is empty! Assign a new rock prefab!"); return; } int totalRockCount = rockGen.rockSpawnAttempts; for (int x = 0; x < totalRockCount; x++) { float randomPosX = Random.Range(-rockGen.transform.localScale.x / 2, rockGen.transform.localScale.x / 2); float randomPosZ = Random.Range(-rockGen.transform.localScale.z / 2, rockGen.transform.localScale.z / 2); randomPosX += rockGen.transform.position.x; randomPosZ += rockGen.transform.position.z; RockPrefabIndex rockPrefabIndex = rockGen.allRockPrefabs[Random.Range(0, rockGen.allRockPrefabs.Count - 1)]; Vector3 raycastPosition = new Vector3(randomPosX, rockGen.transform.position.y, randomPosZ); RaycastHit hit; if (Physics.Raycast(raycastPosition, rockGen.transform.TransformDirection(Vector3.down), out hit, rockGen.raycastLength, rockGen.collisionMasks)) { Vector3 targetPosition = hit.point; if (targetPosition.y > rockGen.terrainMinLimit && targetPosition.y < rockGen.terrainMaxLimit) { SpawnRock(rockPrefabIndex, targetPosition); } } else { } } }