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;
///
/// 当前的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;
}
///
/// 当前的TowerLevel设置为对应怪物的材质显示
///
///
public void SetTowerMonsterMat( Material mat)
{
if (mat == null) return;
// 查找子结点:
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()
{
if (buildEffectPrefab != null)
{
Instantiate(buildEffectPrefab, transform);
}
}
///
/// 播放升级特效
///
public void PlayUpGradeEffect()
{
if (buildEffectPrefab != null)
{
Instantiate(buildEffectPrefab, transform);
}
}
}
}