using Core.Health; using TowerDefense.Agents; using TowerDefense.Level; using UnityEngine; using KTGMGemClient; using System.Collections.Generic; using Core.Utilities; using DG.Tweening; namespace TowerDefense.Economy { /// /// A class that adds money to the currency when the attached DamagableBehaviour dies /// 每一个Agent都会有一个LootDrop类,对应的DamageableBehaviour分别派生自: /// Agent--Targetable--DamageableBehaviour /// [RequireComponent(typeof(DamageableBehaviour))] public class LootDrop : MonoBehaviour { /// /// The amount of loot/currency dropped when object "dies" /// public int lootDropped; /// /// The attached DamagableBehaviour /// protected DamageableBehaviour m_DamageableBehaviour; /// /// Caches attached DamageableBehaviour /// protected virtual void OnEnable() { if (m_DamageableBehaviour == null) { m_DamageableBehaviour = GetComponent(); } m_DamageableBehaviour.configuration.died += OnDeath; } /// /// Unsubscribed from the died event /// protected virtual void OnDisable() { m_DamageableBehaviour.configuration.died -= OnDeath; } /// /// The callback for when the attached object "dies". /// Add to current currency /// protected virtual void OnDeath(HealthChangeInfo info) { m_DamageableBehaviour.configuration.died -= OnDeath; if (LevelManager.instanceExists) { // 当前LootDrop所在的Agent死亡后,给全局的CurrencyManager增加金币. // 当前Agent死亡之后,需要在对手盘加入新的Agent LevelManager levelManager = LevelManager.instance; OpponentMgr opmgr = OpponentMgr.instance; if (levelManager == null) return; Agent agent = gameObject.GetComponent(); if ((agent != null) && agent.opponentAgent) { if (opmgr == null) { return; } opmgr.currency.AddCurrency(lootDropped); /* 修改为不再死亡后发布怪物到对方视野. if( agent.bRespawn) { AgentSetData sd = agent.mAgentData; int attid = OpponentMgr.instance.GetTowerAttID(agent.waveLineID); levelManager.waveManager.SpawnAgent(agent.waveLineID,sd.hp,sd.speed, attid ); }*/ } else { levelManager.currency.AddCurrency(lootDropped); /* if (agent.bRespawn) { AgentSetData sd = agent.mAgentData; int attid = levelManager.GetTowerAttID(agent.waveLineID); opmgr.m_WaveManager.SpawnAgent(agent.waveLineID, sd.hp,sd.speed, attid ); }*/ } } else if (EndlessLevelManager.instanceExists) { Agent agent = gameObject.GetComponent(); if (agent != null) { if (EndlessLevelManager.instance.DropRate > 0) { //查询 float rate = Random.Range(0, 100) * 0.01f; //Debug.Log($"需要处理掉落特效 rate:{rate} EndlessLevelManager.instance.DropRate:{EndlessLevelManager.instance.DropRate}"); if (rate <= EndlessLevelManager.instance.DropRate) { } } PlayDropCoinPS(agent.position); EndlessLevelManager.instance.Currency.AddCurrency(lootDropped); PlayDropGold(lootDropped, agent.position); // 处理掉落 // int tunel = agent.waveLineID + 1; // List rewardList = EndlessPortData.GetDropRewardList(EndlessLevelManager.instance.CurrentLevel, // EndlessLevelManager.instance.WaveManager.CurrentWaveIndex + 1, tunel); // if (rewardList.Count > 0) // EndlessDropManager.instance.AddDrop(rewardList, gameObject.transform.position); } } } GameObject dropGoldPrefab; GameObject mainUI; Camera camera3D; /// /// Awake is called when the script instance is being loaded. /// void Awake() { mainUI = GameObject.Find("MainUI"); dropGoldPrefab = Resources.Load("Prefabs/DropGold"); camera3D = GameObject.Find("SceneCamera3D").GetComponent(); } private void PlayDropGold(int lootDropped, Vector3 worldPos) { if (lootDropped == 0) return; GameObject obj = Poolable.TryGetPoolable(dropGoldPrefab); DropGold dropGold = obj.GetComponent(); dropGold.SetDrop(lootDropped); obj.GetComponent().SetParent(mainUI.GetComponent(), false); Vector3 screenPos = camera3D.WorldToScreenPoint(worldPos); screenPos.z = 0; obj.transform.position = screenPos; obj.transform.localScale = new Vector3(0.8f, 0.8f, 0.8f); float preY = obj.transform.position.y; CanvasGroup canvasGroup = obj.GetComponent(); Sequence sequence = DOTween.Sequence(); sequence.Append(DOTween.To( () => obj.transform.position.y, (float v) => { Vector3 pos = obj.transform.position; pos.y = v; obj.transform.position = pos; }, preY + 45, 0.2f) .SetEase(Ease.OutCubic)); sequence.Append(DOTween.To( () => canvasGroup.alpha, (float v) => { canvasGroup.alpha = v; }, 0, 0.8f).SetDelay(0.5f)); sequence.AppendCallback(() => { canvasGroup.alpha = 1; Poolable.TryPool(obj); }); } private void PlayDropCoinPS(Vector3 worldPos) { GameObject prefab = Resources.Load("Prefabs/DropCoin"); GameObject obj = Poolable.TryGetPoolable(prefab); obj.transform.position = worldPos; GameObject prefabIcon = Resources.Load("Prefabs/DropCoinImage"); GameObject obj1 = Poolable.TryGetPoolable(prefabIcon); obj1.GetComponent().SetParent(mainUI.GetComponent(), false); Vector3 screenPos = camera3D.WorldToScreenPoint(worldPos); screenPos.z = 0; obj1.transform.position = screenPos; obj1.GetComponent().Init(); } } }