public void OnEnable() { groups = GameObject.FindGameObjectWithTag("Foliage").GetComponent <FoilageGroup>(); }
/// <summary> /// This is just a "Demo" function. /// Distributes the points across the location, based on the position /// of Generated Points. /// </summary> public void Distribute(FoilageGroup group) { if (Points == null || group == null) { Debug.Log("Points not generated or foilage groups is null"); return; } RaycastHit hitInfo; // create a parent for distributed objects GameObject parent = new GameObject(); parent.name = location.name + " -Parent"; foreach (Vector3 position in Points) { if (Physics.Raycast(position, Vector3.down, out hitInfo)) // create a ray from destinaion position in -Y direction. { // choose a random object from foilage group objects int rand = Random.Range(0, group.groupObjects.Count); GameObject originalObj = group.groupObjects[rand]; if (originalObj.GetComponent <GrassPatch>()) { GameObject newObj = Instantiate(originalObj); newObj.transform.position = hitInfo.point + new Vector3(0, 3f, 0); newObj.transform.parent = parent.transform; group.Randomize(newObj, group.foilageRules[rand]); GrassPatch instPatch = newObj.GetComponent <GrassPatch>(); GrassPatch originalPatch = originalObj.GetComponent <GrassPatch>(); for (int i = 0; i < originalPatch.grassPlanes.Count; i++) { GrassPlane originalPlane = originalPatch.grassPlanes[i]; // original patch GrassPlane instPlane = instPatch.grassPlanes[i]; // instantiated patch instPlane.transform = Instantiate(originalPlane.transform.gameObject).transform; instPlane.transform.parent = newObj.transform; // copy settings instPlane.groundVerts = originalPlane.groundVerts; // make position its relative position is same as original Vector3 worldPos = newObj.transform.TransformPoint(originalPlane.transform.localPosition); Vector3 localPos = newObj.transform.InverseTransformPoint(worldPos); instPlane.transform.localPosition = localPos; // make it rotate according to ground normal hitInfo = new RaycastHit(); if (Physics.Raycast(instPlane.transform.position, -Vector3.up * 5f, out hitInfo, LayerMask.NameToLayer("Ground"))) { if (group.foilageRules[rand].useNormal) { instPlane.transform.localEulerAngles = hitInfo.normal; } instPlane.transform.position = hitInfo.point; } } instPatch.Place(); } } } }