using System; using System.Collections; using System.Collections.Generic; using UnityEngine; public class LeafHandler : MonoBehaviour { public int NumLeaves = 0; public int MaxLeaves = 700; private HashSet<LeafPhysics> leafs = new HashSet<LeafPhysics>(); public void AddLeaf(LeafPhysics l) { leafs.Add(l); NumLeaves = leafs.Count; } public void RemoveLeaf(LeafPhysics l) { leafs.Remove(l); NumLeaves = leafs.Count; } private SimpleTimer timer; private SimpleTween tween; // Use this for initialization void Start () { timer = new SimpleTimer(); tween = new SimpleTween(); //WaitForNextEvent(); PickNextEvent(); } private void WaitForNextEvent() { timer.Start(UnityEngine.Random.Range(7.0f, 20.0f), PickNextEvent); } private Vector3 windForce = new Vector3(); private Vector2 whirlwindCenter = new Vector3(); private float whirlwindRadius = 0; private float whirlwindForce = 0; private float whirlwindForceUp = 0; private void PickNextEvent() { int eventType = UnityEngine.Random.Range(0, 2); switch (eventType) { case 0: { // wind float windAngle = UnityEngine.Random.Range(0, Mathf.PI * 2); Vector3 windVector = new Vector3(Mathf.Sin(windAngle), 0, Mathf.Cos(windAngle)); windVector.y = UnityEngine.Random.Range(0.8f, 1.2f); float windStrength = UnityEngine.Random.Range(0.8f, 1.3f); float fadeTime = UnityEngine.Random.Range(1.0f, 3.0f); float windTime = UnityEngine.Random.Range(3.0f, 5.0f); Debug.LogError("WIND: V:" + windVector + " S:" + windStrength + " F:" + fadeTime + " T:" + windTime); tween.Init(v => { windForce = windVector * windStrength * v; }, SimpleTween.EaseLinear, 0, 1, fadeTime); tween.OnFinish = () => { tween.Init(v => { //windForce = windVector * windStrength * (Mathf.Sin(v * 25) + 1) * 0.2f; }, SimpleTween.EaseLinear, 0, windTime, windTime); tween.OnFinish = () => { tween.Init(v => { windForce = windVector * windStrength * v; }, SimpleTween.EaseLinear, 1, 0, fadeTime); tween.OnFinish = () => { WaitForNextEvent(); }; }; }; break; } case 1: { // whirlwind whirlwindCenter = UnityEngine.Random.insideUnitCircle * UnityEngine.Random.Range(0, 6.0f); whirlwindRadius = UnityEngine.Random.Range(3.0f, 4.0f); float maxWhirlwindForce = UnityEngine.Random.Range(1.0f, 1.6f); float maxWhirlwindForceUp = UnityEngine.Random.Range(0.3f, 0.8f); float fadeTime = UnityEngine.Random.Range(2.0f, 4.0f); float windTime = UnityEngine.Random.Range(6.0f, 8.0f); Debug.LogError("WHIRLWIND: C:" + whirlwindCenter + " R:" + whirlwindRadius + " F:" + maxWhirlwindForce + " U:" + maxWhirlwindForceUp + " F:" + fadeTime + " T:" + windTime); tween.Init(v => { whirlwindForce = maxWhirlwindForce * v; whirlwindForceUp = maxWhirlwindForceUp * v; }, SimpleTween.EaseLinear, 0, 1, fadeTime); tween.OnFinish = () => { tween.Init(v => { //windForce = windVector * windStrength * (Mathf.Sin(v * 25) + 1) * 0.2f; }, SimpleTween.EaseLinear, 0, windTime, windTime); tween.OnFinish = () => { tween.Init(v => { whirlwindForce = maxWhirlwindForce * v; whirlwindForceUp = maxWhirlwindForceUp * v; }, SimpleTween.EaseLinear, 1, 0, fadeTime); tween.OnFinish = () => { WaitForNextEvent(); }; }; }; break; } } } // Update is called once per frame void Update () { bool hasWind = windForce.sqrMagnitude > 0.00001f; bool hasWhirlwind = whirlwindForce > 0; Vector2 windDir = new Vector2(windForce.x, windForce.y); windDir.Normalize(); float distAway = 9.0f; foreach (LeafPhysics leaf in leafs) { if (hasWind && (UnityEngine.Random.Range(0, 1f) < 0.25f || !leaf.Resting)) { float amount = Vector2.Dot(new Vector2(leaf.Body.velocity.x, leaf.Body.velocity.z), windDir); amount = Math.Max(0, Math.Min(1, 8 - amount)); leaf.Body.AddForce(new Vector3(windForce.x * UnityEngine.Random.Range(0.75f, 1.0f), windForce.y * UnityEngine.Random.Range(0.9f, 1.0f), windForce.z * UnityEngine.Random.Range(0.75f, 1.0f)) * Time.deltaTime * 60 * (leaf.Resting ? 3.0f : 0.4f)); } Vector2 d = new Vector2(leaf.transform.position.x, leaf.transform.position.z); if (hasWhirlwind && (UnityEngine.Random.Range(0, 1f) < 0.15f || !leaf.Resting)) { Vector2 offset = new Vector2(leaf.transform.position.x, leaf.transform.position.z) - whirlwindCenter; Vector2 offsetN = offset.normalized; float distFrom = offset.magnitude; if (distFrom < whirlwindRadius) { Vector2 tangent = new Vector2(-offsetN.y, offsetN.x); Vector2 force = tangent * (whirlwindRadius - distFrom) * whirlwindForce + offset * -0.9f; Vector3 force3D = new Vector3(force.x, whirlwindForceUp * (whirlwindRadius - distFrom + 2), force.y); leaf.Body.AddForce(new Vector3(force3D.x * UnityEngine.Random.Range(0.75f, 1.0f), force3D.y * UnityEngine.Random.Range(0.9f, 1.0f), force3D.z * UnityEngine.Random.Range(0.75f, 1.0f)) * Time.deltaTime * 60 * (leaf.Resting ? 3.0f : 0.4f)); } } if (d.magnitude > distAway && !leaf.Resting) { //leaf.Body.apply } } } }