using Core.Utilities; using DG.Tweening; using System.Collections; using System.Collections.Generic; using TowerDefense.Level; using UnityEngine; using UnityEngine.XR.WSA; public class WaveLineSelMgr : Singleton { /// /// 己方兵线对应的选中效果 /// public List waveLineList; /// /// BOSS警告倒计时界面. /// public GameObject cdBossWarningPrefab; /// /// 己方战场的Boss /// public List selfSkullList; public List oppoSkullList; protected List selfWarningList; protected List selfSkullUIPos; protected GameObject[] selfWarningUI = new GameObject[5]; /// /// 标注战场区域的Object. /// public GameObject battleAreaObject; /// /// 火攻击效果 /// public GameObject skillFirePrefab; /// /// 炸弹攻击效果 /// public GameObject skillBombPrefab; /// /// 停止移动的Buff特效. /// public GameObject bufStopMovePrefab; protected bool zeroState = true; // Start is called before the first frame update void Start() { int wln = waveLineList.Count; for (int ti = 0; ti < wln; ti++) { if (waveLineList[ti]) { Material tmat = waveLineList[ti].GetComponent().material; tmat.color = new Color(1.0f, 1.0f, 1.0f, 0.0f); } } // 处理Skull相关的数据 int skullNum = selfSkullList.Count; selfWarningList = new List(); selfSkullUIPos = new List(); for (int ti = 0; ti < skullNum; ti++) { if (selfSkullList[ti]) { Color tzeroc = new Color(1.0f, 1.0f, 1.0f, 0.0f); Material tmat = selfSkullList[ti].GetComponent().material; tmat.color = tzeroc; tmat = oppoSkullList[ti].GetComponent().material; tmat.color = tzeroc; UnityEngine.Camera sceneCam = ViewPortAdj.instance.cachedCamera; Vector3 centPos = sceneCam.WorldToScreenPoint(oppoSkullList[ti].transform.position); selfSkullUIPos.Add(centPos); } selfWarningList.Add(false); } } /// /// 开启BossWaring倒计时. /// /// public void StartCountDownBossWarning(float cdtime, int waveline) { // 已经显示直接返回. if (selfWarningUI[waveline] != null) return; GameObject cdui = Instantiate(cdBossWarningPrefab); GameObject go = GameObject.Find("BattleMainUI"); if (!go) return; Transform tp = go.GetComponent(); cdui.GetComponent().SetParent(tp, true); cdui.transform.position = selfSkullUIPos[waveline]; cdui.transform.SetAsFirstSibling(); BossWarning bw = cdui.GetComponent(); if (bw) bw.setCountDownTime(cdtime); selfWarningUI[waveline] = cdui; } public void StopCountDownBossWarning(int waveline) { Destroy(selfWarningUI[waveline]); selfWarningUI[waveline] = null; } /// /// 开启某一条兵线的Boss警告. /// /// public void waveLineBossWarning(int waveline, bool warn) { if (selfWarningList[waveline] == warn) return; selfWarningList[waveline] = warn; if (warn) { if (selfSkullList[waveline]) { Material tmat = selfSkullList[waveline].GetComponent().material; Sequence seq = DOTween.Sequence(); seq.Append(tmat.DOColor(new Color(1.0f, 1.0f, 1.0f, 1.0f), 0.4f)); seq.AppendInterval(0.3f); seq.Append(tmat.DOColor(new Color(1.0f, 1.0f, 1.0f, 0.0f), 0.25f)); seq.Append(tmat.DOColor(new Color(1.0f, 1.0f, 1.0f, 1.0f), 0.25f)); seq.AppendInterval(0.3f); seq.Append(tmat.DOColor(new Color(1.0f, 1.0f, 1.0f, 0.0f), 0.25f)); seq.Append(tmat.DOColor(new Color(1.0f, 1.0f, 1.0f, 1.0f), 0.25f)); seq.AppendInterval(0.3f); seq.Append(tmat.DOColor(new Color(1.0f, 1.0f, 1.0f, 0.0f), 0.25f)); seq.Append(tmat.DOColor(new Color(1.0f, 1.0f, 1.0f, 1.0f), 0.25f)); seq.AppendInterval(0.3f); seq.Append(tmat.DOColor(new Color(1.0f, 1.0f, 1.0f, 0.0f), 0.25f)); seq.Append(tmat.DOColor(new Color(1.0f, 1.0f, 1.0f, 1.0f), 0.25f)); } if (oppoSkullList[waveline]) { Material tmat = oppoSkullList[waveline].GetComponent().material; Sequence seq = DOTween.Sequence(); seq.Append(tmat.DOColor(new Color(1.0f, 1.0f, 1.0f, 1.0f), 0.4f)); seq.AppendInterval(0.3f); seq.Append(tmat.DOColor(new Color(1.0f, 1.0f, 1.0f, 0.0f), 0.25f)); seq.Append(tmat.DOColor(new Color(1.0f, 1.0f, 1.0f, 1.0f), 0.25f)); seq.AppendInterval(0.3f); seq.Append(tmat.DOColor(new Color(1.0f, 1.0f, 1.0f, 0.0f), 0.25f)); seq.Append(tmat.DOColor(new Color(1.0f, 1.0f, 1.0f, 1.0f), 0.25f)); seq.AppendInterval(0.3f); seq.Append(tmat.DOColor(new Color(1.0f, 1.0f, 1.0f, 0.0f), 0.25f)); seq.Append(tmat.DOColor(new Color(1.0f, 1.0f, 1.0f, 1.0f), 0.25f)); seq.AppendInterval(0.3f); seq.Append(tmat.DOColor(new Color(1.0f, 1.0f, 1.0f, 0.0f), 0.25f)); seq.Append(tmat.DOColor(new Color(1.0f, 1.0f, 1.0f, 1.0f), 0.25f)); } } else { if (selfSkullList[waveline]) { Material tmat = selfSkullList[waveline].GetComponent().material; tmat.DOKill(); tmat.DOColor(new Color(1.0f, 1.0f, 1.0f, 0.0f), 0.8f); tmat = oppoSkullList[waveline].GetComponent().material; tmat.DOKill(); tmat.DOColor(new Color(1.0f, 1.0f, 1.0f, 0.0f), 0.8f); } } } /// /// 在某一兵线上播放技能特效 /// public void PlayWaveLineEffect(int id) { if ((id >= waveLineList.Count) || (waveLineList[id] == null)) return; GameObject obj = Instantiate(skillFirePrefab); ParticleSystem ps = obj.GetComponent(); if (ps == null) ps = obj.transform.GetChild(0).GetComponent(); ps.transform.position = LevelManager.instance.waveManager.GetWaveEndPos(id); ps.Play(); Destroy(ps.gameObject, ps.main.duration); } /// /// 在战场内某一个位置播放特效 /// /// public void PlayBattleAreaBombEffect(Vector3 pos) { if (skillBombPrefab == null) return; GameObject obj = Instantiate(skillBombPrefab); ParticleSystem ps = obj.GetComponent(); if (ps == null) ps = obj.transform.GetChild(0).GetComponent(); ps.transform.position = pos; ps.Play(); Destroy(ps.gameObject, ps.main.duration); } /// /// 对应兵线发亮. /// /// public void waveLineFlash(int id) { if ((id >= waveLineList.Count) || (waveLineList[id] == null)) return; //设置一个DOTween队列 Sequence flashSeq = DOTween.Sequence(); Material tmat = waveLineList[id].GetComponent().material; flashSeq.Append(tmat.DOColor(new Color(1.0f, 1.0f, 1.0f, 1.0f), 0.1f)); flashSeq.Append(tmat.DOColor(new Color(1.0f, 1.0f, 1.0f, 0.2f), 0.08f)); flashSeq.Append(tmat.DOColor(new Color(1.0f, 1.0f, 1.0f, 1.0f), 0.08f)); flashSeq.AppendInterval(0.05f); flashSeq.Append(tmat.DOColor(new Color(1.0f, 1.0f, 1.0f, 0.2f), 0.08f)); flashSeq.Append(tmat.DOColor(new Color(1.0f, 1.0f, 1.0f, 1.0f), 0.08f)); flashSeq.AppendInterval(0.05f); flashSeq.Append(tmat.DOColor(new Color(1.0f, 1.0f, 1.0f, 0.0f), 0.25f)); } /// /// 对某一条兵线显示选中效果 /// /// public void fadeWaveline(int id, bool fadeOut, float ftime = 0.3f) { if ((id >= waveLineList.Count) || (waveLineList[id] == null)) return; Material tmat = waveLineList[id].GetComponent().material; if (fadeOut) { tmat.DOColor(new Color(1.0f, 1.0f, 1.0f, 1.0f), ftime); } else { tmat.DOColor(new Color(1.0f, 1.0f, 1.0f, 0.0f), ftime); } } /// /// 某一个位置攻击塔位放下。 /// /// public void attackTowerFixed(int pos) { if ((pos >= waveLineList.Count) || (waveLineList[pos] == null)) return; int subone = pos - 1; int addone = pos + 1; if (subone >= 0) waveLineFlash(subone); waveLineFlash(pos); if (addone < waveLineList.Count) waveLineFlash(addone); } // Update is called once per frame void Update() { if (UnityEngine.Input.GetKeyDown(KeyCode.G)) { //PlayWaveLineEffect(2); /*ParticleSystem MoveStopEffect = Instantiate(WaveLineSelMgr.instance.bufStopMovePrefab); MoveStopEffect.transform.position = this.transform.position; MoveStopEffect.Play();*/ } if (UnityEngine.Input.GetKeyDown(KeyCode.V)) { PlayBattleAreaBombEffect(this.battleAreaObject.transform.position); } } }