Exemplo n.º 1
0
 public void OnEnable()
 {
     groups = GameObject.FindGameObjectWithTag("Foliage").GetComponent <FoilageGroup>();
 }
Exemplo n.º 2
0
    /// <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();
                }
            }
        }
    }