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)); } } }
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); }