/// <summary> /// 获取当前感知到的目标的 TargetInfo信息 /// </summary> /// <param name="superposition">给服务的目标,同单位是否叠加</param> /// <param name="direction"> 返回目标计算方式的,依据方向</param> //准星镜头正方向(主相机正方向)or 抖动的随机方向 /// <param name="isNew">是否需要全新的列表</param> 引导技能由于updata 内重新获取了,这里isNew给 false /// <param name="TagercalculationType">准星框or 公式另外计算</param> /// <returns></returns> public List <Crucis.Protocol.TargetInfo> GetCurrentTargetInfos(bool superposition, out Vector3 direction, bool isNew = true, SkillTagercalculationType TagercalculationType = SkillTagercalculationType.CrossSightLens) { List <Crucis.Protocol.TargetInfo> targets = new List <Crucis.Protocol.TargetInfo>(); LinkedList <CCrossSightLoic.Target> entitys = GetCurrQueue(out direction, isNew, TagercalculationType); Dictionary <uint, uint> targetDic = new Dictionary <uint, uint>(); LinkedListNode <CCrossSightLoic.Target> pVertor = entitys.First; ulong pb; while (pVertor != null) { pb = pVertor.Value.target_entityId; pVertor = pVertor.Next; BaseEntity entity = GameplayManager.Instance.GetEntityManager().GetEntityById <BaseEntity>((uint)pb); if (entity == null) { continue; } if (!targetDic.ContainsKey(entity.UId())) { targetDic.Add(entity.UId(), 1); } else { targetDic[entity.UId()] += 1; } } foreach (var item in targetDic) { if (superposition) //数量叠加 { Crucis.Protocol.TargetInfo targetInfo = new Crucis.Protocol.TargetInfo(); targetInfo.TargetId = item.Key; targetInfo.Count = item.Value; targets.Add(targetInfo); } else {//数量不叠加 for (int i = 0; i < item.Value; i++) { Crucis.Protocol.TargetInfo targetInfo = new Crucis.Protocol.TargetInfo(); targetInfo.TargetId = item.Key; targetInfo.Count = 1; targets.Add(targetInfo); } } } return(targets); }
/// <summary> /// 获取当前目标队列 /// </summary> /// <param name="direction"> 返回目标计算方式的,依据方向</param> //准星镜头正方向(主相机正方向)or 抖动的随机方向 /// <param name="isNew"></param> /// <returns></returns> public LinkedList <CCrossSightLoic.Target> GetCurrQueue(out Vector3 direction, bool isNew = true, SkillTagercalculationType TagercalculationType = SkillTagercalculationType.CrossSightLens) { if (isNew) { List <CCrossSightLoic.Target> lists = GetCurrentEntity(out direction, TagercalculationType); m_calculateDirection = direction; List <ulong> bLists = new List <ulong>(); List <Vector3> vLists = new List <Vector3>(); for (int i = 0; i < lists.Count; i++) { bLists.Add(lists[i].target_entityId); vLists.Add(lists[i].target_pos); } bool bclear = false; //目标变了 bool vclear = false; //接触点变化 LinkedListNode <CCrossSightLoic.Target> pVertor = targetsLinkedList.First; CCrossSightLoic.Target pb = null; while (pVertor != null) { pb = pVertor.Value; pVertor = pVertor.Next; if (!bLists.Contains(pb.target_entityId)) { // Leyoutech.Utility.DebugUtility.LogWarning("目标队列", "=============1======获取当前目标队列 不同了================="); bclear = true; break; } if (vclear) { continue; } if (!vLists.Contains(pb.target_pos)) { vclear = true; } } bclear = bclear || (targetsLinkedList.Count != bLists.Count); if (bclear || vclear) { targetsLinkedList.Clear(); for (int i = 0; i < lists.Count; i++) { targetsLinkedList.AddLast(lists[i]); } if (bclear) { targetsQueueIsChange = true; // Leyoutech.Utility.DebugUtility.LogWarning("目标队列", "=============444======获取当前目标队列 不同了================targetsQueueIsChange=" + targetsQueueIsChange); } else { targetsQueueIsChange = false; } } } direction = m_calculateDirection; return(targetsLinkedList); }
/// <summary> /// 获取当前感知到的所有单位 /// </summary> /// <param name="direction"> 返回目标计算方式的,依据方向</param> //准星镜头正方向(主相机正方向)or 抖动的随机方向 /// <returns></returns> private List <CCrossSightLoic.Target> GetCurrentEntity(out Vector3 direction, SkillTagercalculationType TagercalculationType = SkillTagercalculationType.CrossSightLens) { List <CCrossSightLoic.Target> result = new List <CCrossSightLoic.Target>(); direction = CameraManager.GetInstance().GetMainCamereComponent().GetForward(); if (m_OwnerEntity.IsMain()) { //武器&准星 WeaponAndCrossSight m_weaponCS = GetCurrWeaponAndCrossSight(); if (m_weaponCS != null) { List <CCrossSightLoic.Target> targets = null; if (TagercalculationType == SkillTagercalculationType.CrossSightLens) //准星镜头内的目标 { targets = m_weaponCS.GetTargets(); } else if (TagercalculationType == SkillTagercalculationType.Formula) //公式计算的目标,比如抖动 { m_weaponCS.GetBallisticTargetAndOutDirection(out targets, out direction, null); } if (targets != null) { result.AddRange(targets); } } } else { for (int i = 0; i < m_BroadCastTargets.Count; i++) { BaseEntity entity = GameplayManager.Instance.GetEntityManager().GetEntityById <BaseEntity>((uint)m_BroadCastTargets[i]); if (entity == null) { continue; } CCrossSightLoic.Target cct = new CCrossSightLoic.Target(); cct.target_entityId = m_BroadCastTargets[i]; cct.target_pos = entity.GetRootTransform().position; result.Add(cct); } Vector3 worldPosition = m_GameplayProxy.ServerAreaOffsetToClientPosition(m_BroadCastDirection); //服务器坐标,转 Unity 坐标 direction = (worldPosition - m_OwnerEntity.GetRootTransform().position).normalized; //Leyoutech.Utility.DebugUtility.LogError("第三方最远点方向", string.Format("计算方向 -----> ,self = {0} , m_BroadCastDirection = {1}, worldPosition = {2} , PlayPos = {3} , direction = {4}", // m_OwnerEntity.EntityId(), // m_BroadCastDirection, // worldPosition, // m_OwnerEntity.GetRootTransform().position, // direction // )); } // Leyoutech.Utility.DebugUtility.LogWarning("目标队列", "准星 List: " + string.Join(",", result)); return(result); }