chenxin
2020-12-03 0bc89b87a59c3f1f394a54c0901868084463cf28
Assets/Scripts/TowerDefense/UI/HUD/EndlessGameUI.cs
@@ -1,11 +1,8 @@
using System.Globalization;
using Core.Health;
using Core.Health;
using Core.Input;
using Core.Utilities;
using DG.Tweening;
using JetBrains.Annotations;
using System;
using System.Collections;
using System.Collections.Generic;
using TMPro;
using TowerDefense.Level;
@@ -15,7 +12,6 @@
using UnityEngine.EventSystems;
using UnityEngine.UI;
using TowerDefense.Nodes;
using TowerDefense.Affectors;
using KTGMGemClient;
namespace TowerDefense.UI.HUD
@@ -127,11 +123,19 @@
        public TextMoveDoTween bloodCrit;
        /// <summary>
        /// 减速飘字
        /// </summary>
        public Image SlowDownWord;
        /// <summary>
        /// 暴击飘字
        /// </summary>
        public Image CritWord;
        /// <summary>
        /// 购买塔防按钮上的Text.
        /// </summary>
        protected TextMeshProUGUI towerPriceText;
        //protected TextMeshProUGUI towerPriceText1;
        protected bool tdBuyDisable = false;
@@ -351,7 +355,7 @@
        {
            foreach (Tower tower in m_listTower)
            {
                tower.bInAttackMode = canAttack;
                tower.CanAttack = canAttack;
            }
        }
@@ -585,7 +589,7 @@
            SetToDragMode(newT);
            if (towerOld.towerFeature == EFeatureTower.Skill_Bomb)
                m_CurrentTower.SetAttackArea(dragTowerLevel, towerOld.attributeId);
                m_CurrentTower.SetAttackArea(dragTowerLevel, towerOld.ElfId);
        }
        /// <summary>
@@ -673,12 +677,16 @@
            if (!m_CurrentTower || !IsGhostAtValidPosition())
            {
                // 最大级别的Tower不能再合并了.
                if (towerToMove.isAtMaxLevel)
                if (towerToMove.IsMaxLevel)
                    return false;
                // 判断格子上的塔防:
                UIPointer pointer = WrapPointer(pinfo);
                Tower sTower = PickTowerInGrid(pointer);
                // 泡泡禁锢状态不允许合并
                if (sTower.IsBondage) return false;
                if (sTower && sTower != towerToMove)
                {
                    int testLvl = dragTowerLevel;
@@ -702,6 +710,9 @@
                // 判断格子上的塔防:
                UIPointer pointer = WrapPointer(pinfo);
                Tower sTower = PickTowerInGrid(pointer);
                // 泡泡禁锢状态不允许置换
                if (sTower.IsBondage) return false;
                if (sTower && sTower != towerToMove)
                {
@@ -1004,14 +1015,14 @@
                                if (bInAttackModeTower == null)
                                {
                                    bInAttackModeTower = checkTowerPlaceTower;
                                    bInAttackModeTower.currentTowerLevel.SetCanPlace(true);
                                    bInAttackModeTower.CurrentTowerLevel.SetCanPlace(true);
                                }
                                else if (bInAttackModeTower != checkTowerPlaceTower)
                                {
                                    bInAttackModeTower.currentTowerLevel.SetCanPlace(false);
                                    bInAttackModeTower.CurrentTowerLevel.SetCanPlace(false);
                                    bInAttackModeTower = checkTowerPlaceTower;
                                    bInAttackModeTower.currentTowerLevel.SetCanPlace(true);
                                    bInAttackModeTower.CurrentTowerLevel.SetCanPlace(true);
                                }
                            }
@@ -1023,14 +1034,14 @@
                        if (bInAttackModeTower == null)
                        {
                            bInAttackModeTower = checkTowerPlaceTower;
                            bInAttackModeTower.currentTowerLevel.SetCanPlace(true);
                            bInAttackModeTower.CurrentTowerLevel.SetCanPlace(true);
                        }
                        else if (bInAttackModeTower != checkTowerPlaceTower)
                        {
                            bInAttackModeTower.currentTowerLevel.SetCanPlace(false);
                            bInAttackModeTower.CurrentTowerLevel.SetCanPlace(false);
                            bInAttackModeTower = checkTowerPlaceTower;
                            bInAttackModeTower.currentTowerLevel.SetCanPlace(true);
                            bInAttackModeTower.CurrentTowerLevel.SetCanPlace(true);
                        }
                    }
                }
@@ -1069,7 +1080,7 @@
            dragTowerPlacement.CloseCanPlace();
            if (bInAttackModeTower != null)
            {
                bInAttackModeTower.currentTowerLevel.SetCanPlace(false);
                bInAttackModeTower.CurrentTowerLevel.SetCanPlace(false);
                bInAttackModeTower = null;
            }
        }
@@ -1162,7 +1173,7 @@
                }
                else
                {
                    GuideCtrl.Ins.EndDrag11_1();
                    GuideCtrl.Ins.EndDrag5_1();
                    CancelPlaceTower(pointerInfo);
                    Debug.Log("没有放置在火塔上");
                }
@@ -1178,7 +1189,7 @@
            }
            else if (isFreeAttackGrid(pointerInfo) && !bSkill)
            {
                if (!TryPlaceTower(pointerInfo, false, true))
                if (!TryPlaceTower(pointerInfo, false))
                {
                    CancelPlaceTower(pointerInfo);
                    Debug.Log("这里需要返回原位");
@@ -1289,8 +1300,7 @@
            Tower controller = currentTower.controller;
            Tower createdTower = Instantiate(controller);
            createdTower.PlayWaveLineFlash = playEffect;
            createdTower.Initialize(m_CurrentArea, pos);
            createdTower.SetLevel(level - 1);
            createdTower.Initialize(m_CurrentArea, pos, level - 1);
            if (playEffect)
                PlayUpgradeEffect(createdTower);
@@ -1319,7 +1329,7 @@
                ray = m_Camera.ScreenPointToRay(tp.currentPosition)
            };
            int sId = towerToMove.attributeId;
            int sId = towerToMove.ElfId;
            int sLevel = towerToMove.currentLevel;
            // 火是列攻击:
@@ -1409,7 +1419,7 @@
        /// Attempt to position a tower at the given location
        /// </summary>
        /// <param name="pointerInfo">The pointer we're using to position the tower</param>
        public bool TryPlaceTower(PointerInfo pointerInfo, bool force = false, bool zeroCost = false)
        public bool TryPlaceTower(PointerInfo pointerInfo, bool force = false)
        {
            UIPointer pointer = WrapPointer(pointerInfo);
@@ -1420,7 +1430,7 @@
                return false;
            }
            return BuyTower(pointer, force, zeroCost);
            return BuyTower(pointer, force);
        }
        /// <summary>
@@ -1520,16 +1530,11 @@
            {
                throw new InvalidOperationException("Selected Tower is null");
            }
            if (currentSelectedTower.isAtMaxLevel)
            if (currentSelectedTower.IsMaxLevel)
            {
                return;
            }
            int upgradeCost = currentSelectedTower.GetCostForNextLevel();
            bool successfulUpgrade = EndlessLevelManager.instance.Currency.TryPurchase(upgradeCost);
            if (successfulUpgrade)
            {
                currentSelectedTower.UpgradeTower();
            }
            currentSelectedTower.UpgradeTower();
            DeselectTower();
        }
@@ -1546,13 +1551,14 @@
            {
                throw new InvalidOperationException("Selected Tower is null");
            }
            if (currentSelectedTower.isAtMaxLevel)
            if (currentSelectedTower.IsMaxLevel)
                return false;
            // 直接随机升级,零成本。
            // 1:记录当前Tower的Level,删除当前的Tower. 2:从TowerLib中随机找一个高一级别的Tower.
            string towerName = currentSelectedTower.towerName;
            if (currentSelectedTower.towerFeature == EFeatureTower.NULL)
            if (currentSelectedTower.towerFeature == EFeatureTower.NULL && GameConfig.CreateRandomTower)
                towerName = "";
            int towerLvl = currentSelectedTower.currentLevel + 1;
            int posx = currentSelectedTower.gridPosition.x;
@@ -1585,15 +1591,10 @@
            {
                throw new InvalidOperationException("Selected Tower is null");
            }
            int sellValue = currentSelectedTower.GetSellLevel();
            if (EndlessLevelManager.instanceExists && sellValue > 0)
            {
                EndlessLevelManager.instance.Currency.AddCurrency(sellValue);
                currentSelectedTower.Sell();
            currentSelectedTower.Sell();
                // 从列表中删除Tower.
                delTower(currentSelectedTower);
            }
            // 从列表中删除Tower.
            delTower(currentSelectedTower);
            DeselectTower();
        }
@@ -1613,12 +1614,7 @@
            {
                return;
            }
            int cost = m_CurrentTower.controller.purchaseCost;
            bool successfulPurchase = EndlessLevelManager.instance.Currency.TryPurchase(cost);
            if (successfulPurchase)
            {
                PlaceTower();
            }
            PlaceTower();
        }
        /// <summary>
@@ -1628,7 +1624,7 @@
        /// Throws exception when not in a build mode or when tower is not a valid position
        /// </exception>
        /// </summary>
        public bool BuyTower(UIPointer pointer, bool force = false, bool zeroCost = false)
        public bool BuyTower(UIPointer pointer, bool force = false)
        {
            if (!isBuilding) return false;
@@ -1677,10 +1673,7 @@
                return false;
            }
            int cost = m_CurrentTower.controller.purchaseCost;
            if (zeroCost)
                cost = 0;
            bool successfulPurchase = EndlessLevelManager.instance.Currency.TryPurchase(cost);
            bool successfulPurchase = EndlessLevelManager.instance.Currency.TryPurchase(0);
            if (successfulPurchase)
            {
                PlaceGhost(pointer);
@@ -1695,28 +1688,7 @@
        /// <param name="worldPos"></param>
        public void PlayUpgradeEffect(Tower newTower)
        {
            newTower.currentTowerLevel.PlayUpGradeEffect();
            // GameObject effect = TowerUpgradeEffectPrefab;
            // if (newTower.towerFeature == EFeatureTower.NULL)
            // {
            //     string path = $"UI/ToBattle_{newTower.attributeId}";
            //     GameObject prefab = Resources.Load<GameObject>(path);
            //     effect = Instantiate(prefab);
            // }
            // // 在sTower的位置播放升级特效
            // GameObject obj = Instantiate(effect);
            // obj.transform.position = newTower.transform.position;
            // Vector3 pos = obj.transform.position;
            // pos.y += 5f;
            // obj.transform.position = pos;
            // ParticleSystem ps = obj.GetComponent<ParticleSystem>();
            // if (ps == null)
            //     ps = obj.transform.GetChild(0).GetComponent<ParticleSystem>();
            // ps.Play();
            // Destroy(obj, ps.main.duration);
            newTower.CurrentTowerLevel.PlayUpGradeEffect();
        }
        /// <summary>
@@ -1775,7 +1747,7 @@
            if (m_CurrentTower == null || m_CurrentArea == null)
                return false;
            return EndlessLevelManager.instance.Currency.CanAfford(m_CurrentTower.controller.purchaseCost);
            return true;
        }
        /// <summary>
@@ -2047,17 +2019,34 @@
            }
            if (tm)
            {
                tm.GetComponent<Transform>().SetParent(GameObject.Find("MainUI").GetComponent<Transform>(), true);
                string bloodStr = "";
                if (doubleHit)
                    bloodStr += "Dble!";
                if (crit)
                    bloodStr += "Crt!";
                bloodStr += "-";
                tm.GetComponent<Transform>().SetParent(GameObject.Find("MainUI/TextPanel").GetComponent<Transform>(), true);
                string bloodStr = "-";
                bloodStr += ((Int64)val).ToString();
                tm.moveBloodText(spos.x, spos.y, bloodStr, crit);
            }
        }
        /// <summary>
        /// 减速飘字
        /// </summary>
        public void FloatSlowDownWord(Vector3 worldPos)
        {
            Vector3 screenPos = m_Camera.WorldToScreenPoint(worldPos);
            GameObject obj = Instantiate(SlowDownWord.gameObject);
            obj.GetComponent<Transform>().SetParent(GameObject.Find("MainUI/TextPanel").GetComponent<Transform>(), false);
            obj.GetComponent<TextMoveDoTween>().FloatSlowDownWord(screenPos.x, screenPos.y);
        }
        /// <summary>
        /// 暴击飘字
        /// </summary>
        public void FloatCritWord(Vector3 worldPos)
        {
            Vector3 screenPos = m_Camera.WorldToScreenPoint(worldPos);
            GameObject obj = Instantiate(CritWord.gameObject);
            obj.GetComponent<Transform>().SetParent(GameObject.Find("MainUI/TextPanel").GetComponent<Transform>(), false);
            obj.GetComponent<TextMoveDoTween>().FloatCritWord(screenPos.x, screenPos.y);
        }
        private void Start()
@@ -2224,7 +2213,7 @@
            RaycastHit output;
            // River: Raycast的碰撞是游戏内物品的Collider进行碰撞检测的
            bool hasHit = Physics.Raycast(uiPointer.ray, out output, float.MaxValue, towerSelectionLayer);
            if (!hasHit)//|| uiPointer.overUI)
            if (!hasHit || uiPointer.overUI)
            {
                //Debug.Log("没有点中或者点中了UI:" + hasHit.ToString() + "," + uiPointer.overUI.ToString());
                return;
@@ -2232,6 +2221,9 @@
            var controller = output.collider.GetComponent<Tower>();
            if (controller != null)
            {
                // 泡泡禁锢状态不允许拖动
                if (controller.IsBondage) return;
                SelectTower(controller);
            }
@@ -2239,7 +2231,21 @@
            CalSelTowerScreenOffset(info, controller);
        }
        public void OnPressed(PointerInfo info)
        {
            UIPointer uiPointer = WrapPointer(info);
            RaycastHit output;
            bool hasHit = Physics.Raycast(uiPointer.ray, out output, float.MaxValue, towerSelectionLayer);
            if (uiPointer.overUI) return;
            if (hasHit)
            {
                Tower controller = output.collider.GetComponent<Tower>();
                if (controller != null)
                    controller.OnPressed();
            }
        }
        /// <summary>
        /// 鼠标选中一个Tower的时候,计算当前鼠标位置与当前Tower位置在屏幕上坐标位置的偏移量。
@@ -2314,22 +2320,6 @@
            m_Camera = GameObject.Find("SceneCamera3D").GetComponent<Camera>();
            //m_Camera = GetComponent<Camera>();
            TowerDestroyArr = new bool[5, AttackRowNumbers];
        }
        /// <summary>
        /// 战场内所有的Tower实例都需要升级相关的数据.
        /// 找到相同类型的所有Tower,然后进行局内升级的修改。
        /// </summary>
        /// <param name="td"></param>
        protected void towerUpgradeInBattle(TowerLevelUp tlu)
        {
            foreach (Tower tower in m_listTower)
            {
                if (tlu.towerName != tower.towerName)
                    continue;
                tower.upGradeInSceneTL();
            }
            return;
        }
        /// <summary>
@@ -2565,12 +2555,11 @@
                    // Place the ghost
                    Tower controller = m_CurrentTower.controller;
                    Tower createdTower = Instantiate(controller);
                    createdTower.Initialize(m_CurrentArea, m_GridPosition);
                    createdTower.SetLevel(dragTowerLevel);
                    createdTower.Initialize(m_CurrentArea, m_GridPosition, dragTowerLevel);
                    // ATTENTION TO FIX:是否应该加入List:
                    addTower(createdTower);
                    PlayToAttackEffect(createdTower.attributeId, createdTower.transform.position);
                    PlayToAttackEffect(createdTower.ElfId, createdTower.transform.position);
                    dragTowerLevel = 0;
                    CancelGhostPlacement();
                }
@@ -2580,23 +2569,11 @@
        /// <summary>
        /// 播放宝石上阵特效
        /// </summary>
        /// <param name="attributeId">101 火,105 水,109 木</param>
        /// <param name="ElfId">101 火,201 水,301 木</param>
        /// <param name="worldPos">世界坐标</param>
        public void PlayToAttackEffect(int attributeId, Vector3 worldPos)
        public void PlayToAttackEffect(int ElfId, Vector3 worldPos)
        {
            string path = "";
            if (attributeId == 101)
            {
                path = "UI/Effect_Elf_Huo_DengChang_101";
            }
            else if (attributeId == 105)
            {
                path = "UI/Effect_Elf_Shui_DengChang_105";
            }
            else if (attributeId == 109)
            {
                path = "UI/Effect_Elf_Mu_DengChang_109";
            }
            string path = $"UI/DengChang_{ElfId}";
            GameObject prefab = Resources.Load<GameObject>(path);
            GameObject obj = Instantiate(prefab);