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<WaveLineSelMgr>
|
{
|
/// <summary>
|
/// 己方兵线对应的选中效果
|
/// </summary>
|
public List<GameObject> waveLineList;
|
|
/// <summary>
|
/// BOSS警告倒计时界面.
|
/// </summary>
|
public GameObject cdBossWarningPrefab;
|
|
/// <summary>
|
/// 己方战场的Boss
|
/// </summary>
|
public List<GameObject> selfSkullList;
|
public List<GameObject> oppoSkullList;
|
protected List<bool> selfWarningList;
|
protected List<Vector3> selfSkullUIPos;
|
protected GameObject[] selfWarningUI = new GameObject[5];
|
|
/// <summary>
|
/// 标注战场区域的Object.
|
/// </summary>
|
public GameObject battleAreaObject;
|
|
/// <summary>
|
/// 火攻击效果
|
/// </summary>
|
public GameObject skillFirePrefab;
|
|
/// <summary>
|
/// 炸弹攻击效果
|
/// </summary>
|
public GameObject skillBombPrefab;
|
|
/// <summary>
|
/// 停止移动的Buff特效.
|
/// </summary>
|
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<MeshRenderer>().material;
|
tmat.color = new Color(1.0f, 1.0f, 1.0f, 0.0f);
|
}
|
}
|
|
// 处理Skull相关的数据
|
int skullNum = selfSkullList.Count;
|
selfWarningList = new List<bool>();
|
selfSkullUIPos = new List<Vector3>();
|
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<MeshRenderer>().material;
|
tmat.color = tzeroc;
|
tmat = oppoSkullList[ti].GetComponent<MeshRenderer>().material;
|
tmat.color = tzeroc;
|
|
UnityEngine.Camera sceneCam = ViewPortAdj.instance.cachedCamera;
|
Vector3 centPos = sceneCam.WorldToScreenPoint(oppoSkullList[ti].transform.position);
|
selfSkullUIPos.Add(centPos);
|
}
|
selfWarningList.Add(false);
|
}
|
|
}
|
|
/// <summary>
|
/// 开启BossWaring倒计时.
|
/// </summary>
|
/// <param name="cdtime"></param>
|
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<Transform>();
|
cdui.GetComponent<Transform>().SetParent(tp, true);
|
cdui.transform.position = selfSkullUIPos[waveline];
|
cdui.transform.SetAsFirstSibling();
|
BossWarning bw = cdui.GetComponent<BossWarning>();
|
if (bw)
|
bw.setCountDownTime(cdtime);
|
|
selfWarningUI[waveline] = cdui;
|
}
|
|
public void StopCountDownBossWarning(int waveline)
|
{
|
Destroy(selfWarningUI[waveline]);
|
selfWarningUI[waveline] = null;
|
}
|
|
/// <summary>
|
/// 开启某一条兵线的Boss警告.
|
/// </summary>
|
/// <param name="warn"></param>
|
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<MeshRenderer>().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<MeshRenderer>().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<MeshRenderer>().material;
|
tmat.DOKill();
|
tmat.DOColor(new Color(1.0f, 1.0f, 1.0f, 0.0f), 0.8f);
|
|
tmat = oppoSkullList[waveline].GetComponent<MeshRenderer>().material;
|
tmat.DOKill();
|
tmat.DOColor(new Color(1.0f, 1.0f, 1.0f, 0.0f), 0.8f);
|
}
|
}
|
}
|
|
/// <summary>
|
/// 在某一兵线上播放技能特效
|
/// </summary>
|
public void PlayWaveLineEffect(int id)
|
{
|
if ((id >= waveLineList.Count) || (waveLineList[id] == null)) return;
|
|
GameObject obj = Instantiate(skillFirePrefab);
|
ParticleSystem ps = obj.GetComponent<ParticleSystem>();
|
|
if (ps == null)
|
ps = obj.transform.GetChild(0).GetComponent<ParticleSystem>();
|
ps.transform.position = LevelManager.instance.waveManager.GetWaveEndPos(id);
|
ps.Play();
|
Destroy(ps.gameObject, ps.main.duration);
|
}
|
|
/// <summary>
|
/// 在战场内某一个位置播放特效
|
/// </summary>
|
/// <param name="pos"></param>
|
public void PlayBattleAreaBombEffect(Vector3 pos)
|
{
|
if (skillBombPrefab == null) return;
|
|
GameObject obj = Instantiate(skillBombPrefab);
|
ParticleSystem ps = obj.GetComponent<ParticleSystem>();
|
|
if (ps == null)
|
ps = obj.transform.GetChild(0).GetComponent<ParticleSystem>();
|
ps.transform.position = pos;
|
ps.Play();
|
Destroy(ps.gameObject, ps.main.duration);
|
}
|
|
|
/// <summary>
|
/// 对应兵线发亮.
|
/// </summary>
|
/// <param name="id"></param>
|
public void waveLineFlash(int id)
|
{
|
if ((id >= waveLineList.Count) || (waveLineList[id] == null)) return;
|
|
//设置一个DOTween队列
|
Sequence flashSeq = DOTween.Sequence();
|
Material tmat = waveLineList[id].GetComponent<MeshRenderer>().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));
|
}
|
|
/// <summary>
|
/// 对某一条兵线显示选中效果
|
/// </summary>
|
/// <param name="id"></param>
|
public void fadeWaveline(int id, bool fadeOut, float ftime = 0.3f)
|
{
|
if ((id >= waveLineList.Count) || (waveLineList[id] == null)) return;
|
Material tmat = waveLineList[id].GetComponent<MeshRenderer>().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);
|
}
|
}
|
|
/// <summary>
|
/// 某一个位置攻击塔位放下。
|
/// </summary>
|
/// <param name="pos"></param>
|
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);
|
}
|
|
}
|
}
|