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 ParticleSystem skillFirePrefab;
|
|
/// <summary>
|
/// 炸弹攻击效果
|
/// </summary>
|
public ParticleSystem skillBombPrefab;
|
|
/// <summary>
|
/// 停止移动的Buff特效.
|
/// </summary>
|
public ParticleSystem 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;
|
|
ParticleSystem playParticle = Instantiate(skillFirePrefab);
|
playParticle.transform.position = LevelManager.instance.waveManager.GetWaveEndPos( id );
|
playParticle.Play();
|
}
|
|
/// <summary>
|
/// 在战场内某一个位置播放特效
|
/// </summary>
|
/// <param name="pos"></param>
|
public void PlayBattleAreaBombEffect( Vector3 pos)
|
{
|
if (skillBombPrefab == null) return;
|
ParticleSystem playParticle = Instantiate(skillBombPrefab);
|
playParticle.transform.position = pos;
|
playParticle.Play();
|
|
}
|
|
|
/// <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);
|
}
|
|
}
|
}
|