| | |
| | | |
| | | 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> |
| | | /// 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> |
| | | /// Build effect gameObject to instantiate on start |
| | | /// </summary> |
| | | public GameObject buildEffectPrefab; |
| | | |
| | | /// <summary> |
| | | /// 升级特效 |
| | | /// </summary> |
| | | public GameObject UpgradeEffectPrefab; |
| | | |
| | | /// <summary> |
| | | /// 当前的Level对应的DamagerData. |
| | | /// </summary> |
| | | public Damager levelDamager; |
| | | /// <summary> |
| | | /// 当前的Level对应的DamagerData. |
| | | /// </summary> |
| | | public Damager levelDamager; |
| | | |
| | | /// <summary> |
| | | /// Reference to scriptable object with level data on it |
| | | /// </summary> |
| | | public TowerLevelData levelData; |
| | | /// <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 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> |
| | | /// The list of effects attached to the tower |
| | | /// </summary> |
| | | Affector[] m_Affectors; |
| | | |
| | | /// <summary> |
| | | /// TEST CODE: 是否已经缩放. |
| | | /// </summary> |
| | | protected bool bScaleForCombat = false; |
| | | /// <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; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 当前的TowerLevel设置为对应怪物的材质显示 |
| | | /// </summary> |
| | | /// <param name="mat"></param> |
| | | public void SetTowerMonsterMat( Material mat) |
| | | /// <summary> |
| | | /// Gets the list of effects attached to the tower |
| | | /// </summary> |
| | | protected Affector[] Affectors |
| | | { |
| | | if (mat == null) return; |
| | | // 查找子结点: |
| | | foreach (Transform t in transform.GetComponentsInChildren<Transform>()) |
| | | { |
| | | if (t.name == "Cube") |
| | | { |
| | | t.GetComponent<MeshRenderer>().material = mat; |
| | | Vector3 scale = t.localScale; |
| | | |
| | | if( !this.bScaleForCombat) |
| | | 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; |
| | | } |
| | | |
| | | /// <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; |
| | | |
| | | if (!this.bScaleForCombat) |
| | | { |
| | | scale.z *= 1.267f; |
| | | t.localScale = scale; |
| | | Vector3 pos = t.localPosition; |
| | | pos.z -= 0.2f; |
| | | t.localPosition = pos; |
| | | bScaleForCombat = true; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | 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() |
| | | { |
| | | if (buildEffectPrefab != null) |
| | | { |
| | | Instantiate(buildEffectPrefab, transform); |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 播放升级特效 |
| | | /// </summary> |
| | | public void PlayUpGradeEffect() |
| | | /// <summary> |
| | | /// A method for activating or deactivating the attached <see cref="Affectors"/> |
| | | /// </summary> |
| | | public void SetAffectorState(bool state, int waveline) |
| | | { |
| | | if (buildEffectPrefab != null) |
| | | { |
| | | Instantiate(buildEffectPrefab, transform); |
| | | } |
| | | } |
| | | } |
| | | 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); |
| | | } |
| | | } |
| | | } |
| | | } |