using System.Collections; using System.Collections.Generic; using UnityEngine; //火灾是否可蔓延 //一个人可控50平方,其他200平方 public class SpreadFireController : MonoBehaviour { private float timer = 1f; private Transform p_AllParent; //private Transform p_car; //private Transform p_watercannon; private Transform p_FireNormal; private bool flag = false; /// /// 普通火的火堆集合(主火Id) /// private static List fireNormalStruckList = new List(); /// /// 火堆字典,每个火堆对应几个火,key为火堆(主火id),list为这堆火由哪几个火组成 /// public static Dictionary> fireStruckContainDic = new Dictionary>(); // Use this for initialization void Start() { p_AllParent = GameObject.Find("P_AllParent").transform; //p_car = p_AllParent.Find("P_Cars"); //p_watercannon = p_AllParent.Find("P_Tools/P_WaterCannon"); p_FireNormal = p_AllParent.Find("P_Disasters/P_FireNormal"); } private void OnDestroy() { fireNormalStruckList.Clear(); fireStruckContainDic.Clear(); } private void OnDisable() { fireNormalStruckList.Clear(); fireStruckContainDic.Clear(); } // Update is called once per frame void Update() { if (GameSettings.othersSettings.isStartDrill) { if (flag==false) { GetFireStruckList(); GetfireStruckContainDic(); flag = true; } if (CurrentUserInfo.mySelf==null||CurrentUserInfo.room==null) { return; } if (CurrentUserInfo.mySelf.Id==CurrentUserInfo.room.Owner.UserInfo.Id) { if (p_FireNormal.childCount > 0) { if (GetNumOnAllNormalFire() > 0) { timer -= Time.deltaTime; if (timer < 0) { removeDiedFireFromDic(); judgeControl(); timer = 1f; } } else { timer -= Time.deltaTime; if (timer < 0) { for (int i = 0; i < fireNormalStruckList.Count; i++) { GameObject normal = EntitiesManager.Instance.GetEntityByID(fireNormalStruckList[i]); if (normal.GetComponent().BeController) { normal.GetComponent().BeController = false; } } timer = 1f; } } } } } } //获取普通火及蔓延火上的水枪数,大于0表示有水枪打在火上 int GetNumOnAllNormalFire() { int num = 0; for (int i = 0; i < p_FireNormal.childCount; i++) { num += p_FireNormal.GetChild(i).GetComponent().Straightwater.Count; } return num; } /// /// 获取火堆集合,也就是克隆的普通火的数量 /// void GetFireStruckList() { fireNormalStruckList.Clear(); for (int i = 0; i < p_FireNormal.childCount; i++) { BaseGameObjInfo baseinfo = p_FireNormal.GetChild(i).GetComponent(); if (baseinfo.gameObjType == CloneObjType.fireNormal) { if (!fireNormalStruckList.Contains(baseinfo.gameObjID)) { fireNormalStruckList.Add(baseinfo.gameObjID); } } } } /// /// 获取火堆的字典 /// void GetfireStruckContainDic() { fireStruckContainDic.Clear(); for (int i = 0; i < fireNormalStruckList.Count; i++) { List fireFightNormalList = new List(); //把主火加进字典 fireFightNormalList.Add(EntitiesManager.Instance.GetEntityByID(fireNormalStruckList[i]).GetComponent()); fireStruckContainDic.Add(fireNormalStruckList[i], fireFightNormalList); } } /// /// 从字典中移除熄灭的火堆 /// void removeDiedFireFromDic() { for (int i = 0; i < fireNormalStruckList.Count; i++) { if (fireStruckContainDic[fireNormalStruckList[i]].Count<1) { fireStruckContainDic.Remove(fireNormalStruckList[i]); fireNormalStruckList.Remove(fireNormalStruckList[i]); } } } /// /// 判断火堆是否被控制(控火强度大于火堆面积) /// void judgeControl() { for (int i = 0; i < fireNormalStruckList.Count; i++) { float fireArea = 0;//该火堆的面积 float waterControlArea = 0;//该火堆总控火面积 GameObject mainfire = EntitiesManager.Instance.GetEntityByID(fireNormalStruckList[i]); List nowstruck = fireStruckContainDic[fireNormalStruckList[i]]; for (int j = 0; j < nowstruck.Count; j++) { //该火堆中每个火的baseinfo BaseGameObjInfo info = nowstruck[j].GetComponent(); if (info.gameObjType==CloneObjType.fireNormal) { fireArea += info.GetComponent().fireAttribute.initialSize; } if(info.gameObjType == CloneObjType.SpreadedFire) { fireArea += 10; } if (info.GetComponent().Straightwater.Count>0) { //作用在某个火的面积 for (int k = 0; k < info.GetComponent().Straightwater.Count; k++) { WaterFightFire water = info.GetComponent().Straightwater[k]; if (water.GetComponentInParent().gameObjType == CloneObjType.fireman|| water.GetComponentInParent().gameObjType == CloneObjType.FirefightingRobot) { waterControlArea += 50; } else { waterControlArea += 200; } } } } //如果可以控制住 if (waterControlArea >= fireArea) { mainfire.GetComponent().BeController = true; } else { mainfire.GetComponent().BeController = false; } } } }