using UnityEngine; using System.Collections; using UnityEngine.UI; using AX.TrackRecord; using AX.MessageSystem; /// /// 爆炸控制 /// public class OilTankDisasterControl : MonoBehaviour { public OilTank oilTank; public int StartTime = 0;//单位为分 public int HappenTime = 0;//单位为秒 public bool IsExplode; //是否爆炸 public bool IsTwist;//是否变形 private Slider slider; public GameObject Normal;//正常 private GameObject Twist;//变形扭曲 private GameObject Explosion;//爆炸 private GameObject Cap;//盖 private GameObject ExplosionEffect; private GameObject fire; public float thrust = 0f;//推力 public bool flag; public bool flag1; public float r; public float g; public float b; private float radius1 = 5.0f; private float radius2 = 8.0f; private float radius3 = 10.0f; private int count = 3; private Vector2 circle; private Vector3 randomPos; public bool happening;//是否在发生过程中 private RaycastHit hit; public GameObject messageBox; private string youGName;//油罐名称 private GameObject OilTankInfoImage; private GameObject ConfirmExplodeWin; private OilTank dataHelp = new OilTank(); public bool csRecordHappened;//true表示爆炸/变形发生完的初始记录情况 private GameObject FireY; // Use this for initialization GameObject ExplodeFire; public enum OilModleSence: int { 原名5场景=1, 伏牛溪场景=2, 卡贝乐场景=3 } OilModleSence oliSence = OilModleSence.原名5场景; void Awake()//Start() { if (GameObject.Find("FuNiuXiYK") && GameObject.Find("FuNiuXiYK").activeInHierarchy) { oliSence = OilModleSence.伏牛溪场景; } else if (GameObject.Find("5") && GameObject.Find("5").activeInHierarchy) { oliSence = OilModleSence.原名5场景; } else if (GameObject.Find("kabeile_scenes") && GameObject.Find("kabeile_scenes").activeInHierarchy) { oliSence = OilModleSence.卡贝乐场景; } MessageDispatcher.AddListener("SETOILTANK", Execute); MessageDispatcher.AddListener("TriggerOilTankProcess", OnTriggerOilTankProcess); OilTankInfoImage = GameObject.Find("Canvas").transform.Find("OilTankInfoImage").gameObject; ConfirmExplodeWin = GameObject.Find("Canvas").transform.Find("ConfirmExplodeWin").gameObject; messageBox = GameObject.Find("Canvas").transform.Find("MessageBox").gameObject; slider = this.GetComponent(); ExplosionEffect = Resources.Load("Prefabs/ZQPrefab/WFX_Nuke"); fire = Resources.Load("Prefabs/ZQPrefab/GroundFire_OilTank"); if (this.transform.parent.parent.name == "QiuXingGuan") { //youGName = this.transform.parent.parent.FindChild("QiuGuan").name; //Normal = this.transform.parent.parent.FindChild("QiuGuan").gameObject; youGName = Normal.name; Twist = this.transform.parent.parent.Find("QG_Twist").gameObject; Explosion = this.transform.parent.parent.Find("QG_Exp").gameObject; Cap = Explosion.transform.Find("QG_G").gameObject; } if (this.transform.parent.parent.name == "FuDingGuan") { //youGName = this.transform.parent.parent.FindChild("WaiFuDingGuan").name; //Normal = this.transform.parent.parent.FindChild("WaiFuDingGuan").gameObject; youGName = Normal.name; Twist = this.transform.parent.parent.Find("WFDG_Twist").gameObject; Explosion = this.transform.parent.parent.Find("WFDG_Exp").gameObject; Cap = Explosion.transform.Find("XF_WFDG_0").gameObject; } if (this.transform.parent.parent.name == "GongDingG") { //youGName = this.transform.parent.parent.FindChild("GongDingGuan").name; //Normal = this.transform.parent.parent.FindChild("GongDingGuan").gameObject; youGName = Normal.name; Twist = this.transform.parent.parent.Find("GDG_Twist").gameObject; Explosion = this.transform.parent.parent.Find("GDG_Exp").gameObject; Cap = Explosion.transform.Find("GongDingGuanGaiZi_Explode").gameObject; ///伏牛溪FireY if ((int)oliSence == 2 || (int)oliSence == 3) { FireY = this.transform.parent.parent.Find("FireY").gameObject; } } } void Execute(IMessage msg) { if ((string)msg.Sender == Normal.name) { oilTank = (OilTank)msg.Data; LoadOilTankData(); if (!(ExamInfoHelpClass.loadSceneMode == ExamInfoHelpClass.LoadSceneMode.EditQuestion || ExamInfoHelpClass.loadSceneMode == ExamInfoHelpClass.LoadSceneMode.CopyQuestion)) { if ((IsExplode || IsTwist) && HappenTime != 0) { if ((int)oilTank.CanvasSliderValue == 0) {//还没发生 StartCoroutine(WaitSenconds(StartTime * 60f)); } else {//发生一半 slider.value = (int)oilTank.CanvasSliderValue; r = oilTank.OilTankColor.x; g = oilTank.OilTankColor.y; b = oilTank.OilTankColor.z; StartCoroutine(WaitSenconds(StartTime * 0f)); } } } } } public void LoadOilTankData() { if (this.transform.parent.parent.name == "QiuXingGuan") { thrust = 1000f; //Normal = this.transform.parent.parent.FindChild("QiuGuan").gameObject; //oilTank = Normal.GetComponent().oilTank; StartTime = oilTank.StartTime; HappenTime = oilTank.HappenTime; slider.maxValue = HappenTime; IsExplode = oilTank.IsExplode; IsTwist = oilTank.IsTwist; //Twist = this.transform.parent.parent.FindChild("QG_Twist").gameObject; //Explosion = this.transform.parent.parent.FindChild("QG_Exp").gameObject; //Cap = Explosion.transform.FindChild("QG_G").gameObject; } if (this.transform.parent.parent.name == "FuDingGuan") { thrust = 14000f; //Normal = this.transform.parent.parent.FindChild("WaiFuDingGuan").gameObject; //oilTank = Normal.GetComponent().oilTank; StartTime = oilTank.StartTime; HappenTime = oilTank.HappenTime; slider.maxValue = HappenTime; IsExplode = oilTank.IsExplode; IsTwist = oilTank.IsTwist; //Twist = this.transform.parent.parent.FindChild("WFDG_Twist").gameObject; //Explosion = this.transform.parent.parent.FindChild("WFDG_Exp").gameObject; //Cap = Explosion.transform.FindChild("XF_WFDG_0").gameObject; } if (this.transform.parent.parent.name == "GongDingG") { thrust = 1500f; //Normal = this.transform.parent.parent.FindChild("GongDingGuan").gameObject; //oilTank = Normal.GetComponent().oilTank; StartTime = oilTank.StartTime; HappenTime = oilTank.HappenTime; slider.maxValue = HappenTime; IsExplode = oilTank.IsExplode; IsTwist = oilTank.IsTwist; //Twist = this.transform.parent.parent.FindChild("GDG_Twist").gameObject; //Explosion = this.transform.parent.parent.FindChild("GDG_Exp").gameObject; //Cap = Explosion.transform.FindChild("GongDingGuanGaiZi_Explode").gameObject; } } void OnDestroy() { MessageDispatcher.RemoveListener("SETOILTANK", Execute); MessageDispatcher.RemoveListener("TriggerOilTankProcess", OnTriggerOilTankProcess); } IEnumerator WaitSenconds(float delay) { yield return new WaitForSeconds(delay); if (!happening) { happening = true; InvokeRepeating("ExplodeCtrl", 1f, 1f); } } private void ExplodeCtrl() { slider.value++; r = r + 1f / HappenTime; g = g + 1f / HappenTime; b = b + 1f / HappenTime; if (Normal != null && Normal.transform.parent.name == "QiuXingGuan") { Normal.transform.Find("XF_QGGT_0").GetComponent().material.SetColor("_EmissionColor", new Color(r, g, b)); } if (Normal != null && Normal.transform.parent.name == "FuDingGuan") { Normal.transform.Find("XF_WFDGT_0").GetComponent().material.SetColor("_EmissionColor", new Color(r, g, b)); } if (Normal != null && Normal.transform.parent.name == "GongDingG") { if ((int)oliSence == 1) { Normal.transform.Find("guanbi").GetComponent().material.SetColor("_EmissionColor", new Color(r, g, b)); Normal.transform.Find("guanding").GetComponent().material.SetColor("_EmissionColor", new Color(r, g, b)); } } dataHelp.CanvasSliderValue = slider.value; dataHelp.OilTankColor = new Vector3(r,g,b); if (RecordManager.Instance.IsRecording) { MessageDispatcher.SendMessage((object)Normal.name, "RecordOilTankTimerEvent", dataHelp); } } // Update is called once per frame void Update() { //创建考题,备课中新建课件,自学 if (ExamInfoHelpClass.loadSceneMode == ExamInfoHelpClass.LoadSceneMode.CreatQuestion || ExamInfoHelpClass.loadSceneMode == ExamInfoHelpClass.LoadSceneMode.EditQuestion || ExamInfoHelpClass.loadSceneMode == ExamInfoHelpClass.LoadSceneMode.CopyQuestion || ExamInfoHelpClass.loadSceneMode == ExamInfoHelpClass.LoadSceneMode.PrepareMode || ExamInfoHelpClass.loadSceneMode == ExamInfoHelpClass.LoadSceneMode.EditCourceware || ExamInfoHelpClass.loadSceneMode == ExamInfoHelpClass.LoadSceneMode.SelfStudyMode) { //新建节点,既没有新建节点也没有加载节点两种情况下允许按F5设置开始爆炸(加载节点不允许按F5设置开始爆炸) if (RecordManager.Instance.IsRecording || (!RecordManager.Instance.IsRecording && !LoadManager.Instance.IsPlayBacking)) { Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); if (Physics.Raycast(ray, out hit, Mathf.Infinity)) { if (hit.transform.parent.name == youGName) { if (Input.GetKeyDown(KeyCode.F5)) { if (!happening) { if (!flag) { if (!Normal.GetComponent().oilTank.IsExplode && !Normal.GetComponent().oilTank.IsTwist) { messageBox.GetComponent().showMessage(ShowMessageType.prompt, "提示信息", "还没设置爆炸或变形"); } else { OilTankInfoImage.SetActive(false); ConfirmExplodeWin.SetActive(true); ConfirmExplodeWin.transform.Find("ConfirmButton").GetComponent().youGuan = this.gameObject; } } else { messageBox.GetComponent().showMessage(ShowMessageType.prompt, "提示信息", "爆炸或变形已经发生过了"); } } else { messageBox.GetComponent().showMessage(ShowMessageType.prompt, "提示信息", "已经开始填充危险条"); } } } } if (happening) { if (!flag1) { //加载设置的油罐属性 oilTank = Normal.GetComponent().oilTank; LoadOilTankData(); if (HappenTime != 0) { InvokeRepeating("ExplodeCtrl", 1f, 1f); } flag1 = true; } if (HappenTime != 0 && slider.value == HappenTime) { if (!flag) { if (IsExplode) { CancelInvoke("ExplodeCtrl"); Normal.SetActive(false); AudioManager.Instance.Play(BoomType.Expolsion); Explosion.SetActive(true); Instantiate(ExplosionEffect, Cap.transform.position, Quaternion.identity); Cap.GetComponent().AddForce(Cap.transform.up * thrust); ///伏牛溪 if ((int)oliSence == 2 || (int)oliSence == 3) { ExplodeFire = Instantiate(fire, new Vector3(Explosion.transform.position.x, FireY.transform.position.y, Explosion.transform.position.z), Quaternion.identity, GameObject.Find("AllParent").transform.Find("pfire")) as GameObject; } else if ((int)oliSence == 1) { ExplodeFire = Instantiate(fire, new Vector3(Explosion.transform.position.x, Explosion.transform.position.y + 1.5f, Explosion.transform.position.z), Quaternion.identity, GameObject.Find("AllParent").transform.Find("pfire")) as GameObject; } //var explodedFire = ExplodeFire.AddComponent(); var explodedFire = ExplodeFire.GetComponent(); ExplodeFire.name = "中队名" + "-" + "fire" + "-" + "GroundFire_OilTank" + "-" + Normal.name+ "-" + TrackRecordHelpClass.GetFileNameAccordingTime(System.DateTime.Now) + (count + 1); if (RecordManager.Instance.IsRecording)//记录爆炸/变形产生的火实例化的事件 { MessageDispatcher.SendMessage("RecordInstantiateEvent", (object)ExplodeFire.name); } explodedFire.youGuan = Normal; RandomCloneFire(); } if (IsTwist) { CancelInvoke("ExplodeCtrl"); Normal.SetActive(false); AudioManager.Instance.Play(BoomType.Twist); Twist.SetActive(true); } flag = true; } } } } } //培训事件型记录情况下加载时 if (LoadManager.Instance.IsPlayBacking) { if (HappenTime != 0 && slider.value == HappenTime) { if (!csRecordHappened)//排除备课爆炸完初始记录情况回放时触发爆炸特效 { if (!flag) { if (IsExplode) { //CancelInvoke("ExplodeCtrl"); Normal.SetActive(false); AudioManager.Instance.Play(BoomType.Expolsion); Explosion.SetActive(true); Instantiate(ExplosionEffect, Cap.transform.position, Quaternion.identity); Cap.GetComponent().AddForce(Cap.transform.up * thrust); //GameObject ExplodeFire = Instantiate(fire, // new Vector3(Explosion.transform.position.x, Explosion.transform.position.y + 1.5f, Explosion.transform.position.z), // Quaternion.identity, // GameObject.Find("AllParent").transform.FindChild("pfire")) as GameObject; //var explodedFire = ExplodeFire.AddComponent(); //var explodedFire = ExplodeFire.GetComponent(); //explodedFire.youGuan = Normal; //RandomCloneFire(); } if (IsTwist) { //CancelInvoke("ExplodeCtrl"); Normal.SetActive(false); Twist.SetActive(true); AudioManager.Instance.Play(BoomType.Twist); } flag = true; } } } } //考试时加载考题 if (happening) { if (HappenTime != 0 && slider.value == HappenTime) { if (!flag) { if (IsExplode) { CancelInvoke("ExplodeCtrl"); Normal.SetActive(false); AudioManager.Instance.Play(BoomType.Expolsion); Explosion.SetActive(true); Instantiate(ExplosionEffect, Cap.transform.position, Quaternion.identity); Cap.GetComponent().AddForce(Cap.transform.up * thrust); GameObject ExplodeFire = Instantiate(fire, new Vector3(Explosion.transform.position.x, Explosion.transform.position.y + 1.5f, Explosion.transform.position.z), Quaternion.identity, GameObject.Find("AllParent").transform.Find("pfire")) as GameObject; //var explodedFire = ExplodeFire.AddComponent(); var explodedFire = ExplodeFire.GetComponent(); ExplodeFire.name = "中队名" + "-" + "fire" + "-" + "GroundFire_OilTank" + "-" + Normal.name + "-" + TrackRecordHelpClass.GetFileNameAccordingTime(System.DateTime.Now) + (count + 1); explodedFire.youGuan = Normal; RandomCloneFire(); } if (IsTwist) { CancelInvoke("ExplodeCtrl"); Normal.SetActive(false); Twist.SetActive(true); AudioManager.Instance.Play(BoomType.Twist); } flag = true; } } } } public void RandomCloneFire() { for (int i = 0; i < count; i++) { if (Normal != null && Normal.transform.parent.name == "QiuXingGuan") circle = Random.insideUnitCircle * radius1; if (Normal != null && Normal.transform.parent.name == "FuDingGuan") circle = Random.insideUnitCircle * radius2; if (Normal != null && Normal.transform.parent.name == "GongDingG") //circle = Random.insideUnitCircle * radius3; circle = Random.insideUnitCircle * Normal.transform.GetComponent().radius; if ((int)oliSence==2|| (int)oliSence == 3) { randomPos = new Vector3(Explosion.transform.position.x + circle.x, FireY.transform.position.y, Explosion.transform.position.z + circle.y); } else if ((int)oliSence == 1) { randomPos = new Vector3(Explosion.transform.position.x + circle.x, Explosion.transform.position.y + 1.5f, Explosion.transform.position.z + circle.y); } GameObject ExplodeFire = Instantiate(fire, randomPos, Quaternion.identity, GameObject.Find("AllParent").transform.Find("pfire")) as GameObject; //var explodedFire = ExplodeFire.AddComponent(); var explodedFire = ExplodeFire.GetComponent(); ExplodeFire.name = "中队名" + "-" + "fire" + "-" + "GroundFire_OilTank" + "-" + Normal.name + "-" + TrackRecordHelpClass.GetFileNameAccordingTime(System.DateTime.Now) + i; if (RecordManager.Instance.IsRecording)//记录爆炸/变形产生的火实例化的事件 { MessageDispatcher.SendMessage("RecordInstantiateEvent", (object)ExplodeFire.name); } explodedFire.youGuan = Normal; } } //油罐初始记录情况下(包括备课,考题初始记录两种情况),爆炸/变形发生完了的情况,回放对油罐的处理(爆炸情况下盖子在回放逻辑那边处理,火按记录情况回放) public void InitializationRecordBackPlay() { oilTank = Normal.GetComponent().oilTank; if (oilTank.IsExplode) { Normal.SetActive(false); AudioManager.Instance.Play(BoomType.Expolsion); Explosion.SetActive(true); slider.value = oilTank.HappenTime; } if (oilTank.IsTwist) { Normal.SetActive(false); Twist.SetActive(true); AudioManager.Instance.Play(BoomType.Twist); slider.value = oilTank.HappenTime; } } //油罐初始记录情况下(包括备课,考题初始记录两种情况),爆炸/变形还没发生或者发生一半的情况,回放对油罐的处理 private void OnTriggerOilTankProcess(IMessage msg) { if ((string)msg.Data == Normal.name) { oilTank = Normal.GetComponent().oilTank; if (ExamInfoHelpClass.loadSceneMode == ExamInfoHelpClass.LoadSceneMode.ExamineMode) {//考试加载考题,需要接着触发过程 if ((int)oilTank.CanvasSliderValue != oilTank.HappenTime) { MessageDispatcher.SendMessage((string)msg.Data, "SETOILTANK", oilTank); } } else {//备课等其他情况加载, 不需要接着触发过程,只需还原记录的状态 if ((int)oilTank.CanvasSliderValue != 0) {//发生一半(还没发生不用处理) slider.value = oilTank.CanvasSliderValue; if (Normal != null && Normal.transform.parent.name == "QiuXingGuan") { Normal.transform.Find("XF_QGGT_0").GetComponent().material.SetColor("_EmissionColor", new Color(oilTank.OilTankColor.x, oilTank.OilTankColor.y, oilTank.OilTankColor.z)); } if (Normal != null && Normal.transform.parent.name == "FuDingGuan") { Normal.transform.Find("XF_WFDGT_0").GetComponent().material.SetColor("_EmissionColor", new Color(oilTank.OilTankColor.x, oilTank.OilTankColor.y, oilTank.OilTankColor.z)); } if (Normal != null && Normal.transform.parent.name == "GongDingG") { Normal.transform.Find("guanbi").GetComponent().material.SetColor("_EmissionColor", new Color(oilTank.OilTankColor.x, oilTank.OilTankColor.y, oilTank.OilTankColor.z)); Normal.transform.Find("guanding").GetComponent().material.SetColor("_EmissionColor", new Color(oilTank.OilTankColor.x, oilTank.OilTankColor.y, oilTank.OilTankColor.z)); } } } } } //备课初始记录时还没开始填充危险条或已经填充一部分就保存节点,再加载节点时要停调等待时间方法和填充危险条方法。 //避免这种情况加载后依然继续发生 public void StopTrigger() { StopAllCoroutines(); CancelInvoke("ExplodeCtrl"); } }