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>
|
/// 升级特效
|
/// </summary>
|
public GameObject UpgradeEffectPrefab;
|
|
/// <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>
|
/// TEST CODE: 是否已经缩放.
|
/// </summary>
|
protected bool bScaleForCombat = false;
|
|
/// <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);
|
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);
|
}
|
|
/// <summary>
|
/// 未上阵塔缩放,固定缩放
|
/// </summary>
|
public void NormalScale()
|
{
|
mat.localScale = normalScale;
|
mat.localPosition = Vector3.zero;
|
}
|
|
|
/// <summary>
|
/// 设置火宝石攻速
|
/// </summary>
|
/// <param name="isAttack"></param>
|
public void SetFireMatSpeed(bool isFast)
|
{
|
if (isFast)
|
{
|
mat.GetComponent<MeshRenderer>().material.SetFloat("_Speed", 40);
|
}
|
else
|
{
|
//还原10
|
mat.GetComponent<MeshRenderer>().material.SetFloat("_Speed", 8);
|
}
|
}
|
/// <summary>
|
/// 上阵塔缩放
|
/// </summary>
|
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;
|
}
|
}
|
}
|
|
|
/// <summary>
|
/// 当前的TowerLevel设置为对应怪物的材质显示
|
/// </summary>
|
/// <param name="mat"></param>
|
public void SetTowerMonsterMat(Material material)
|
{
|
if (material == null) return;
|
|
mat.GetComponent<MeshRenderer>().material = material;
|
|
// 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<Transform>())
|
// {
|
// if (t.name == "Cube")
|
// {
|
// t.GetComponent<MeshRenderer>().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;
|
// // }
|
// }
|
// }
|
}
|
|
/// <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()
|
{
|
|
}
|
|
/// <summary>
|
/// 播放升级特效
|
/// </summary>
|
public void PlayUpGradeEffect()
|
{
|
if (UpgradeEffectPrefab != null)
|
{
|
GameObject obj = Instantiate(UpgradeEffectPrefab);
|
obj.transform.position = gameObject.transform.position;
|
ParticleSystem ps = obj.GetComponent<ParticleSystem>();
|
|
if (ps == null)
|
ps = obj.transform.GetChild(0).GetComponent<ParticleSystem>();
|
|
Vector3 pos = obj.transform.position;
|
pos.y = 5f;
|
obj.transform.position = pos;
|
ps.Play();
|
Destroy(obj, ps.main.duration);
|
}
|
}
|
}
|
}
|