using System.Collections.Generic; using ET; using UnityEngine; using RuntimeData; using Logic; using TH1_Core.Managers; using TH1_Logic.Core; using TMPro; using UI; using Unity.Collections; namespace TH1Renderer { public enum ProjectileType { None, Melee, Arrow, Bomb, MagicFireBall,CityExp,Coin, Faith, RemiliaAttack, PatchouliAttack, MokouAttack, ReisenAttack, KaguyaAttack } public enum ProjectileMoveType { Straight, Parabola,HighParabola,CityExpHighParabola, CoinParabola,Spin, Curved,Bounce,SpecialAnimation} public class ProjectileData { public MapData MapData; public uint Id; public ProjectileType ProjectileType; public ProjectileMoveType ProjectileMoveType; public Vector3 StartPos; public Vector3 EndPos; public ProjectileData(MapData mapData,uint id,ProjectileType projectileType,ProjectileMoveType moveType,Vector3 startPos,Vector3 endPos) { MapData = mapData; Id = id; ProjectileType = projectileType; ProjectileMoveType = moveType; StartPos = startPos; EndPos = endPos; } } public class ProjectileManager { public uint IdCalculater; public Dictionary ProjectileDataDict; public Dictionary ROProjectileMap; //存储的projectileRenderMap对象(在主界面挂在谁下面)和projectilePrefab对象(用来实例化) private GameObject _projectilePrefab; private Transform _projectileRenderMap; private Transform _coinTransform; public void Init(Transform trans) { IdCalculater = 0; _projectileRenderMap = trans; ProjectileDataDict = new Dictionary(); ROProjectileMap = new Dictionary(); _projectilePrefab = Resources.Load($"Prefab/projectilePrefab"); } public void Update() { foreach(var t in ROProjectileMap) t.Value.Update(); } //返回coin要改飞往的地方 public Vector3 GetCoinPos() { if (_coinTransform == null) { _coinTransform = UIManager.Instance.ROUIManager?.transform.Find("TopBarPanel/MoneyPanel/Icon")?.transform; } return _coinTransform.position; } //TODO legacy方案,后续迭代,用下面那个(飞行方式不要传入,因为走info //创建一个飞行道具,要传入起始位置和结束位置,然后传入飞行道具类型,飞行方式 public void CreateProjectile(Vector3 startPos, Vector3 endPos, ProjectileType projectileType, ProjectileMoveType moveType, int para = -1) { var mapData = Main.MapData; //如果不在视野,不处理 mapData.GridMap.GetGridDataByVector3Pos(startPos, out var g1); mapData.GridMap.GetGridDataByVector3Pos(endPos,out var g2); if (g1 == null || g2 == null) return; if (!mapData.PlayerMap.SelfPlayerData.Sight.CheckIsInSight(g1.Id) && mapData.PlayerMap.SelfPlayerData.Sight.CheckIsInSight(g2.Id)) return; //先创建新的projectileData数据 var t = new ProjectileData(mapData, IdCalculater++, projectileType, moveType, startPos, endPos); ProjectileDataDict[t.Id] = t; //再创建对应projectileRender对象,以及绑定的prefab ROProjectileMap[t.Id] = new ProjectileRenderer(_projectilePrefab, _projectileRenderMap, t); if (projectileType == ProjectileType.Faith) ROProjectileMap[t.Id].GetROProjectile().transform.Find("Faith/Text").GetComponent().text = "+" + para; } //TODO 后续都走这个,上面那个legacy了 public void CreateProjectile(Vector3 startPos, Vector3 endPos, ProjectileType projectileType) { if (!Table.Instance.ProjectileTypeDataAssets.GetProjectileTypeInfo(projectileType, out var info)) return; CreateProjectile(startPos,endPos,projectileType,info.MoveType); } //TODO 把这里multi函数和上面的projectile函数,全部换成便捷方式(下方的Coin和Faith public void CreateProjectileMulti(Vector3 startPos, Vector3 endPos, ProjectileType projectileType, ProjectileMoveType moveType,int count, float interval = 0.1f) { var mapData = Main.MapData; if (count == 0) return; //如果不在视野,不处理 if(mapData.GridMap.GetGridDataByVector3Pos(startPos, out var g1) && mapData.GridMap.GetGridDataByVector3Pos(endPos,out var g2)) if (!mapData.PlayerMap.SelfPlayerData.Sight.CheckIsInSight(g1.Id) && mapData.PlayerMap.SelfPlayerData.Sight.CheckIsInSight(g2.Id)) return; count--; //先创建新的projectileData数据 var t = new ProjectileData(mapData, IdCalculater++, projectileType, moveType, startPos, endPos); ProjectileDataDict[t.Id] = t; //再创建对应projectileRender对象,以及绑定的prefab ROProjectileMap[t.Id] = new ProjectileRenderer(_projectilePrefab, _projectileRenderMap, t); float tt = 0f; while (count > 0) { count--; tt += interval; Timer.Instance.TimerRegister(this, () => { var ttt = new ProjectileData(mapData, IdCalculater++, projectileType, moveType, startPos, endPos); ProjectileDataDict[t.Id] = t; //再创建对应projectileRender对象,以及绑定的prefab ROProjectileMap[ttt.Id] = new ProjectileRenderer(_projectilePrefab, _projectileRenderMap, t); } ,tt,"ProjectileManager_CreateMulti"); //先创建新的projectileData数据 } } //发起coin获得动画的便捷函数 public void CreateCoinProjectile(Vector3 startPos,int count) { CreateProjectileMulti(startPos, GetCoinPos(), ProjectileType.Coin, ProjectileMoveType.CoinParabola, count: count, interval: 0.05f); } //发起faith获得动画的便捷函数 public void CreateFaithProjectile(Vector3 startPos,int num) { } } }