示例#1
0
        /// <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);
        }
示例#2
0
        /// <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);
        }
示例#3
0
        /// <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);
        }