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
|
{
|
/// <summary>
|
/// An individual level of a tower
|
/// </summary>
|
[DisallowMultipleComponent]
|
public class TowerLevel : MonoBehaviour, ISerializationCallbackReceiver
|
{
|
/// <summary>
|
/// The prefab for communicating placement in the scene
|
/// </summary>
|
public TowerPlacementGhost towerGhostPrefab;
|
|
/// <summary>
|
/// Build effect gameObject to instantiate on start
|
/// </summary>
|
public GameObject buildEffectPrefab;
|
|
|
/// <summary>
|
/// 当前的Level对应的DamagerData.
|
/// </summary>
|
public Damager levelDamager;
|
|
/// <summary>
|
/// Reference to scriptable object with level data on it
|
/// </summary>
|
public TowerLevelData levelData;
|
|
/// <summary>
|
/// The parent tower controller of this tower
|
/// </summary>
|
protected Tower m_ParentTower;
|
|
/// <summary>
|
/// The list of effects attached to the tower
|
/// </summary>
|
Affector[] m_Affectors;
|
|
/// <summary>
|
/// Gets the list of effects attached to the tower
|
/// </summary>
|
protected Affector[] Affectors
|
{
|
get
|
{
|
if (m_Affectors == null)
|
{
|
m_Affectors = GetComponentsInChildren<Affector>();
|
}
|
return m_Affectors;
|
}
|
}
|
|
/// <summary>
|
/// The physics layer mask that the tower searches on
|
/// </summary>
|
public LayerMask mask { get; protected set; }
|
|
/// <summary>
|
/// Gets the cost value
|
/// </summary>
|
public int cost
|
{
|
get { return levelData.cost; }
|
}
|
|
/// <summary>
|
/// Gets the sell value
|
/// </summary>
|
public int sell
|
{
|
get { return levelData.sell; }
|
}
|
|
/// <summary>
|
/// Gets the max health
|
/// </summary>
|
public int maxHealth
|
{
|
get { return levelData.maxHealth; }
|
}
|
|
/// <summary>
|
/// Gets the starting health
|
/// </summary>
|
public int startingHealth
|
{
|
get { return levelData.startingHealth; }
|
}
|
|
/// <summary>
|
/// Gets the tower description
|
/// </summary>
|
public string description
|
{
|
get { return levelData.description; }
|
}
|
|
/// <summary>
|
/// Gets the tower description
|
/// </summary>
|
public string upgradeDescription
|
{
|
get { return levelData.upgradeDescription; }
|
}
|
|
/// <summary>
|
/// Initialises the Effects attached to this object
|
/// </summary>
|
public virtual void Initialize(Tower tower, LayerMask enemyMask, IAlignmentProvider alignment)
|
{
|
mask = enemyMask;
|
|
foreach (Affector effect in Affectors)
|
{
|
effect.Initialize(alignment, mask);
|
|
}
|
m_ParentTower = tower;
|
}
|
|
/// <summary>
|
/// 当前的TowerLevel设置为对应怪物的材质显示
|
/// </summary>
|
/// <param name="mat"></param>
|
public void SetTowerMonsterMat( Material mat)
|
{
|
if (mat == null) return;
|
// 查找子结点:
|
foreach (Transform t in transform.GetComponentsInChildren<Transform>())
|
{
|
if (t.name == "Cube")
|
{
|
t.GetComponent<MeshRenderer>().material = mat;
|
Vector3 scale = t.localScale;
|
scale.z *= 1.267f;
|
t.localScale = scale;
|
Vector3 pos = t.localPosition;
|
pos.z -= 0.2f;
|
t.localPosition = pos;
|
}
|
}
|
}
|
|
/// <summary>
|
/// A method for activating or deactivating the attached <see cref="Affectors"/>
|
/// </summary>
|
public void SetAffectorState(bool state,int waveline )
|
{
|
foreach (Affector affector in Affectors)
|
{
|
if (affector != null)
|
{
|
affector.enabled = state;
|
affector.waveLineID = waveline;
|
}
|
}
|
}
|
|
|
/// <summary>
|
/// Returns a list of affectors that implement ITowerRadiusVisualizer
|
/// </summary>
|
/// <returns>ITowerRadiusVisualizers of tower</returns>
|
public List<ITowerRadiusProvider> GetRadiusVisualizers()
|
{
|
List<ITowerRadiusProvider> visualizers = new List<ITowerRadiusProvider>();
|
foreach (Affector affector in Affectors)
|
{
|
var visualizer = affector as ITowerRadiusProvider;
|
if (visualizer != null)
|
{
|
visualizers.Add(visualizer);
|
}
|
}
|
return visualizers;
|
}
|
|
/// <summary>
|
/// Returns the dps of the tower
|
/// </summary>
|
/// <returns>The dps of the tower</returns>
|
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()
|
{
|
}
|
|
|
/// <summary>
|
/// 获取当前TowerLevel对应的AttackRise.
|
/// </summary>
|
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;
|
}
|
|
/// <summary>
|
/// Insntiate the build particle effect object
|
/// </summary>
|
void Start()
|
{
|
if (buildEffectPrefab != null)
|
{
|
Instantiate(buildEffectPrefab, transform);
|
}
|
}
|
|
/// <summary>
|
/// 播放升级特效
|
/// </summary>
|
public void PlayUpGradeEffect()
|
{
|
if (buildEffectPrefab != null)
|
{
|
Instantiate(buildEffectPrefab, transform);
|
}
|
}
|
}
|
}
|