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); } } } }