using System.Collections.Generic; using Common.Utility.CombatEvent; using Core.Utility; using Fort23.Core; using Fort23.Mono; using Fort23.UTool; using GameLogic.Combat.CombatTool; using UnityEngine; using Utility; namespace GameLogic.CombatScenesTool { public class CombatEquipFallManager : Singleton { private Transform herobagTran; public Animator BagAnimator; public BetterList allEquipFall = new BetterList(); public class EquipFallObject : CObject { private GameObjectPool GameObjectPool; private Parabola3DPath Parabola3DPath; private float _currTime; private int stateIndex; private float _addTime; public EquipFallObjectMono EquipFallObjectMono; public void Init(GameObjectPool GameObjectPool, Parabola3DPath Parabola3DPath) { this.GameObjectPool = GameObjectPool; this.Parabola3DPath = Parabola3DPath; _addTime = 1.0f / Parabola3DPath.totalFlightTime; EquipFallObjectMono = GameObjectPool.own.GetComponent(); EquipFallObjectMono.idleObject.SetActive(false); } public override void Dispose() { } public override void ActiveObj() { } public override void DormancyObj() { GObjectPool.Instance.Recycle(GameObjectPool); GameObjectPool = null; CObjectPool.Instance.Recycle(Parabola3DPath); _currTime = 0; stateIndex = 0; } public void Update(float t) { if (stateIndex == 0) { _currTime += t * _addTime * 2; Vector3 pos = Parabola3DPath.GetPositionAtTime(_currTime); GameObjectPool.own.transform.position = pos; if (_currTime > 1) { EquipFallObjectMono.idleObject.SetActive(true); stateIndex = 1; _currTime = 0; } } else if (stateIndex == 1) { _currTime += t; if (_currTime > 2) { stateIndex = 2; _currTime = 0; } } else if (stateIndex == 2) { EquipFallObjectMono.idleObject.SetActive(false); _currTime += t; Vector3 pos = CombatEquipFallManager.Instance.GetUIPos(); var position = GameObjectPool.own.transform.position; float d = Vector3.SqrMagnitude(position - pos); float addTime = 1.0f / (d / 64); position = Vector3.Lerp(position, pos, addTime * t); GameObjectPool.own.transform.position = position; if (d < 0.3f) { if (Instance.BagAnimator != null) { Instance.BagAnimator.Play("HeroBags_pick"); } CombatEquipFallManager.Instance.allEquipFall.Remove(this); CObjectPool.Instance.Recycle(this); } } } } public Vector3 GetUIPos() { if (herobagTran == null) { MainUIPanel mainUIPanel = UIManager.Instance.GetComponent(); herobagTran = mainUIPanel.herobag.transform; BagAnimator = mainUIPanel.herobag.GetComponent(); } Vector3 pos = UIManager.Instance.UIWorldToWorld(herobagTran.position); return pos; } public void Init() { StaticUpdater.Instance.AddRenderUpdateCallBack(Update); EventManager.Instance.AddEventListener(CustomEventType.Combat_EquipFall, Combat_EquipFall); } protected void Combat_EquipFall(IEventData ievetEquia) { Combat_EquipFallEventData combatEquipFallEventData = ievetEquia as Combat_EquipFallEventData; Fall(combatEquipFallEventData.fallEquip, combatEquipFallEventData.startPos_WorldPos); } public override void Dispose() { StaticUpdater.Instance.RemoveRenderUpdateCallBack(Update); EventManager.Instance.RemoveEventListener(CustomEventType.Combat_EquipFall, Combat_EquipFall); } public void Fall(string[] allEquip, Vector3 worldPos) { for (int i = 0; i < allEquip.Length; i++) { GObjectPool.Instance.FetchAsync(allEquip[i], delegate(GameObjectPool pool) { EquipFallObject equipFallObject = CObjectPool.Instance.Fetch(); // equipFallObject.GameObjectPool = pool; Parabola3DPath parabolaPath = CObjectPool.Instance.Fetch(); parabolaPath.addY = 3; Vector3 startPos = worldPos; float x = Random.Range(-2f, 2f); float z = Random.Range(-2f, 2f); Vector3 endPos = startPos + new Vector3(x, 0, z); parabolaPath.SetPos(startPos, endPos); pool.own.transform.position = startPos; if (pool == null) { TrailRenderer[] _trailRenderers= pool.own.transform.GetComponentsInChildren(false); if (_trailRenderers != null) { for (int j = 0; j < _trailRenderers.Length; j++) { _trailRenderers[i].Clear(); } } } // equipFallObject.Parabola3DPath = parabolaPath; equipFallObject.Init(pool, parabolaPath); allEquipFall.Add(equipFallObject); }); } } public void Update() { for (int i = 0; i < allEquipFall.Count; i++) { allEquipFall[i].Update(Time.deltaTime); } } } }