Beispiel #1
0
    void OnTriggerStay2D(Collider2D collider)
    {
        Banana banana = collider.GetComponent <Banana>();

        if (banana)
        {
            if (attracks)
            {
                Vector2 toCenter = gameObject.transform.position - banana.gameObject.transform.position;
                toCenter.Normalize();

                banana.myBody.AddForce(toCenter * attractPower);
            }

            else
            {
                player.AddPoint();
                banana.PlayParticleSystem();
                Destroy(banana.gameObject);
            }
        }

        else if (attracks)
        {
            PlanetSphere planet = collider.GetComponent <PlanetSphere>();

            if (planet)
            {
                Vector2 toPlanet       = planet.gameObject.transform.position - player.transform.position;
                float   increaseFactor = 1.0f / Mathf.Sqrt(toPlanet.magnitude);

                toPlanet.Normalize();

                player.GetRigidBody().AddForce(toPlanet * (planet.GetPullForce() + increaseFactor));
            }
        }
    }
Beispiel #2
0
    private GameObject GenerateLeaves(int index, Vector3 top, Color baseColor, out Mesh mesh, out Material mat)
    {
        scale      = Random.Range(scaleMin, scaleMax);
        pointCount = Random.Range(detailMin, detailMax);

        var leafChild = new GameObject("Leaves");

        leafChild.transform.SetParent(transform);
        var leafFilter = leafChild.AddComponent <MeshFilter>();
        var leafRender = leafChild.AddComponent <MeshRenderer>();
        var leafMesh   = new Mesh();

        switch (treeType)
        {
        case TreeType.APPLETREE:
        default: {
            if (index == 0)
            {
                scale = scaleMax;
            }
            Vector3[] points   = new Vector3[pointCount];
            var       spread   = leafSpread * (scale / scaleMax) / 2;
            var       randOffs = new Vector3(Random.Range(-1f, 1f) * spread, Random.Range(-1f, 1f) * spread, Random.Range(-1f, 1f) * spread) * (index == 0 ? 0 : 1);
            for (int i = 0; i < points.Length; i++)
            {
                points[i]  = new Vector3(Random.Range(-(scale / 2) - shapeElongation.x, (scale / 2) + shapeElongation.x), Random.Range(-(scale / 2) - shapeElongation.y, (scale / 2) + shapeElongation.y), Random.Range(-(scale / 2) - shapeElongation.z, (scale / 2) + shapeElongation.z));
                points[i] += randOffs + top;
            }

            List <Vector3> verts   = new List <Vector3>();
            List <Vector3> normals = new List <Vector3>();
            List <int>     tris    = new List <int>();
            new ConvexHullCalculator().GenerateHull(new List <Vector3>(points), flatShade, ref verts, ref tris, ref normals);
            leafMesh.vertices  = verts.ToArray();
            leafMesh.triangles = tris.ToArray();
            leafMesh.normals   = normals.ToArray();

            leafMesh.RecalculateBounds();
            leafMesh.RecalculateNormals();
                                #if UNITY_EDITOR
            MeshUtility.Optimize(leafMesh);
                                #endif

            leafRender.sharedMaterial = new Material(this.leaves);
            Color leafColor = baseColor * Random.Range(0.75f, 1.25f);
            leafRender.sharedMaterial.SetColor("_Color", leafColor);
            leafRender.sharedMaterial.SetColor("_RimColor", leafColor * 0.9f);
            leafChild.transform.localPosition = Vector3.up * HeightSegments * trunkHeight;
            leafChild.transform.localScale    = Vector3.one;
            leafFilter.sharedMesh             = leafMesh;
            mesh = leafMesh;
            mat  = leafRender.sharedMaterial;
            break;
        }

        case TreeType.BROCCAULI: {
            if (index == 0)
            {
                scale = scaleMax;
            }
            float detail = ((float)(pointCount - 4) / detailMax) * 4f;
            var   spread = leafSpread * (scale / 150f) / 2;
            //var size = scaleMax / scale;
            var point = new Vector3(0, Random.Range(-(scale / 2) - shapeElongation.y, (scale / 2) + shapeElongation.y), 0);
            point   += top;
            point.y += (index / 2f);                     //* scaleMin;
            if (index == 0)
            {
                point.x = point.z = 0;
            }

            var height = (index * 2f) / (AmountOfLeaves * 2f);
            if (height > 1)
            {
                height -= 1;
                height  = 1f - height;
            }
            var offset = new Vector3(Random.Range(0, 1f), 0, Random.Range(0, 1f)) * height * (spread * 100f) * (index > AmountOfLeaves ? -1f : 1f);
            point += offset;

            leafMesh = new PlanetSphere().Create(scale, (int)detail, point);
            leafMesh.RecalculateBounds();
            leafMesh.RecalculateNormals();

                                #if UNITY_EDITOR
            MeshUtility.Optimize(leafMesh);
                                #endif

            leafRender.sharedMaterial = new Material(this.leaves);
            var leafColor = baseColor * Random.Range(0.6f, 1.3f);
            leafRender.sharedMaterial.SetColor("_Color", leafColor);
            leafRender.sharedMaterial.SetColor("_RimColor", leafColor);
            leafChild.transform.localScale = Vector3.one * scale;
            leafFilter.sharedMesh          = leafMesh;
            mesh = leafMesh;
            mat  = leafRender.sharedMaterial;
            break;
        }
        }

        return(leafChild);
    }