using System.Collections.Generic;
using ActionGameFramework.Health;
using Core.Health;
using TowerDefense.Affectors;
using TowerDefense.Towers.Data;
using TowerDefense.UI.HUD;
using UnityEngine;
namespace TowerDefense.Towers
{
///
/// An individual level of a tower
///
[DisallowMultipleComponent]
public class TowerLevel : MonoBehaviour, ISerializationCallbackReceiver
{
///
/// The prefab for communicating placement in the scene
///
public TowerPlacementGhost towerGhostPrefab;
///
/// Build effect gameObject to instantiate on start
///
public GameObject buildEffectPrefab;
///
/// 升级特效
///
public GameObject UpgradeEffectPrefab;
///
/// 当前的Level对应的DamagerData.
///
public Damager levelDamager;
///
/// Reference to scriptable object with level data on it
///
public TowerLevelData levelData;
///
/// The parent tower controller of this tower
///
protected Tower m_ParentTower;
///
/// The list of effects attached to the tower
///
Affector[] m_Affectors;
///
/// TEST CODE: 是否已经缩放.
///
protected bool bScaleForCombat = false;
///
/// Gets the list of effects attached to the tower
///
protected Affector[] Affectors
{
get
{
if (m_Affectors == null)
{
m_Affectors = GetComponentsInChildren();
}
return m_Affectors;
}
}
///
/// The physics layer mask that the tower searches on
///
public LayerMask mask { get; protected set; }
///
/// Gets the cost value
///
public int cost
{
get { return levelData.cost; }
}
///
/// Gets the sell value
///
public int sell
{
get { return levelData.sell; }
}
///
/// Gets the max health
///
public int maxHealth
{
get { return levelData.maxHealth; }
}
///
/// Gets the starting health
///
public int startingHealth
{
get { return levelData.startingHealth; }
}
///
/// Gets the tower description
///
public string description
{
get { return levelData.description; }
}
///
/// Gets the tower description
///
public string upgradeDescription
{
get { return levelData.upgradeDescription; }
}
///
/// Initialises the Effects attached to this object
///
public virtual void Initialize(Tower tower, LayerMask enemyMask, IAlignmentProvider alignment)
{
mask = enemyMask;
foreach (Affector effect in Affectors)
{
effect.Initialize(alignment, mask);
effect.towerPtr = tower;
}
m_ParentTower = tower;
}
private Transform mat;
Vector3 normalScale;
private Vector3 fireScale = new Vector3(1.92f, 1.92f, 2.208f);
private Vector3 woodScale = new Vector3(1.5f, 1.5f, 2.82f);
private Vector3 waterScale = new Vector3(1.0f, 1.0f, 1.88f);
private Vector3 fireOffectp = new Vector3(0f, 0f, -0.15f);
private Vector3 woodOffectp = new Vector3(0.08f, 0f, 0.2f);
private void Awake()
{
mat = transform.Find("Cube");
normalScale = new Vector3(1.5f, 1.5f, 1.5f);
}
///
/// 未上阵塔缩放,固定缩放
///
public void NormalScale()
{
mat.localScale = normalScale;
mat.localPosition = Vector3.zero;
}
///
/// 上阵塔缩放
///
public void ResetScale()
{
if (transform.name.StartsWith("GrowUpTower"))
{
//火元素
mat.localScale = fireScale;
mat.localPosition = fireOffectp;
}
else if (transform.name.StartsWith("BlinkTower"))
{
//木元素
mat.localScale = woodScale;
mat.localPosition = woodOffectp;
}
else if (transform.name.StartsWith("CopyCatTower"))
{
//水元素
//mat.localScale = woodScale;
Vector3 scale = mat.localScale;
if (!this.bScaleForCombat)
{
scale.z *= 1.267f;
mat.localScale = scale;
Vector3 pos = mat.localPosition;
pos.z -= 0.2f;
mat.localPosition = pos;
bScaleForCombat = true;
}
}
}
///
/// 当前的TowerLevel设置为对应怪物的材质显示
///
///
public void SetTowerMonsterMat(Material material)
{
if (material == null) return;
mat.GetComponent().material = material;
ResetScale();
// if (transform.name.StartsWith("GrowUpTower") && mat.localPosition != fireOffectp)
// {
// mat.localPosition = fireOffectp;
// }
// else if (transform.name.StartsWith("BlinkTower") && mat.localPosition != woodOffectp)
// {
// //木元素
// mat.localPosition = woodOffectp;
// }
// // 查找子结点:
// foreach (Transform t in transform.GetComponentsInChildren())
// {
// if (t.name == "Cube")
// {
// t.GetComponent().material = mat;
// //Vector3 scale = t.localScale;
// // if (!this.bScaleForCombat)
// // {
// // scale.z *= 1.267f;
// // t.localScale = scale;
// // Vector3 pos = t.localPosition;
// // pos.z -= 0.2f;
// // t.localPosition = pos;
// // bScaleForCombat = true;
// // }
// }
// }
}
///
/// A method for activating or deactivating the attached
///
public void SetAffectorState(bool state, int waveline)
{
foreach (Affector affector in Affectors)
{
if (affector != null)
{
affector.enabled = state;
affector.waveLineID = waveline;
}
}
}
///
/// Returns a list of affectors that implement ITowerRadiusVisualizer
///
/// ITowerRadiusVisualizers of tower
public List GetRadiusVisualizers()
{
List visualizers = new List();
foreach (Affector affector in Affectors)
{
var visualizer = affector as ITowerRadiusProvider;
if (visualizer != null)
{
visualizers.Add(visualizer);
}
}
return visualizers;
}
///
/// Returns the dps of the tower
///
/// The dps of the tower
public float GetTowerDps()
{
float dps = 0;
foreach (Affector affector in Affectors)
{
var attack = affector as AttackAffector;
if (attack != null && attack.damagerProjectile != null)
{
dps += attack.GetProjectileDamage() * attack.fireRate;
}
}
return dps;
}
public void Kill()
{
m_ParentTower.KillTower();
}
public void OnBeforeSerialize()
{
}
///
/// 获取当前TowerLevel对应的AttackRise.
///
public float attackRise { get { return m_ParentTower.attackRise; } }
public void OnAfterDeserialize()
{
// Setting this member to null is required because we are setting this value on a prefab which will
// persists post run in editor, so we null this member to ensure it is repopulated every run
m_Affectors = null;
}
///
/// Insntiate the build particle effect object
///
void Start()
{
}
///
/// 播放升级特效
///
public void PlayUpGradeEffect()
{
if (UpgradeEffectPrefab != null)
{
GameObject obj = Instantiate(UpgradeEffectPrefab);
obj.transform.position = gameObject.transform.position;
ParticleSystem ps = obj.GetComponent();
if (ps == null)
ps = obj.transform.GetChild(0).GetComponent();
Vector3 pos = obj.transform.position;
pos.y = 5f;
obj.transform.position = pos;
ps.Play();
Destroy(obj, ps.main.duration);
}
}
}
}