using System.Collections; using System.Collections.Generic; using UnityEngine; using AX.MessageSystem; using System; public enum WindDirection { East = 4, East_South = -3, South = -2, West_South = -1, West = 0, West_North = 1, North = 2, East_North = 3 } public class WindDirectionSet : MonoBehaviour { public bool IsFire = true; public ParticleSystem smoke; private Transform wind; private WindZone windZone; private float rotation_Y; public Vector3 dirVec;//风向 // Use this for initialization void Awake() { if (smoke == null) smoke = transform.Find("Fire_Smoke_LG").GetComponent(); wind = GameObject.Find("WindZone").transform; windZone = wind.GetComponent(); } // Update is called once per frame void Update() { } private void OnEnable() { MessageDispatcher.AddListener("SET_SMOKE_DIRECTION", SmokeDirectionSet); MessageDispatcher.SendMessage("SET_SMOKE_DIRECTION"); } private void OnDisable() { MessageDispatcher.RemoveListener("SET_SMOKE_DIRECTION", SmokeDirectionSet); } private void SmokeDirectionSet(IMessage obj) { rotation_Y = ClampAngle(Mathf.Ceil(wind.rotation.eulerAngles.y)); int dir = (int)(rotation_Y / 45); dirVec = WindDir(dir); float windForce = windZone.windMain; var emission = smoke.emission; var rate = emission.rateOverTime; if (windForce == 0) { rate.constant = 1; } else { rate.constant = windForce; } if (IsFire) emission.rateOverTime = rate; else emission.rateOverTime = 50 - rate.constant; var force = smoke.forceOverLifetime; force.x = dirVec.x * windForce; force.y = dirVec.y * windForce; force.z = dirVec.z * windForce; } private Vector3 WindDir(int dir) { Vector3 dirVec = new Vector3(); if (dir == (int)WindDirection.East) { dirVec = new Vector3(0, 0, 1); } else if (dir == (int)WindDirection.West) { dirVec = new Vector3(0, 0, -1); } else if (dir == (int)WindDirection.South) { dirVec = new Vector3(1, 0, 0); } else if (dir == (int)WindDirection.North) { dirVec = new Vector3(-1, 0, 0); } else if (dir == (int)WindDirection.East_South) { dirVec = new Vector3(1, 0, 1); } else if (dir == (int)WindDirection.East_North) { dirVec = new Vector3(-1, 0, 1); } else if (dir == (int)WindDirection.West_South) { dirVec = new Vector3(1, 0, -1); } else if (dir == (int)WindDirection.West_North) { dirVec = new Vector3(-1, 0, -1); } return dirVec; } private float ClampAngle(float angle) { if (angle < -180) angle += 360; if (angle > 180) angle -= 360; return angle; } }